如何为 Registration-Free 激活配置基于 .NET Framework 的 COM 组件

基于 .NET Framework 的组件的无注册激活比 COM 组件要复杂一些。 安装程序需要两个清单:

  • COM 应用程序必须具有 Win32 样式的应用程序清单才能标识托管组件。

  • 基于 .NET Framework 的组件必须具有组件清单,才能在运行时获取所需的激活信息。

本主题介绍如何将应用程序清单与应用程序相关联;将组件清单与组件相关联;并在程序集中嵌入组件清单。

创建应用程序清单

  1. 使用 XML 编辑器创建(或修改)COM 应用程序拥有的应用程序清单,该应用程序与一个或多个托管组件进行互作。

  2. 在文件的开头插入以下标准标头:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    </assembly>
    

    有关清单元素及其属性的信息,请参阅 应用程序清单

  3. 识别清单所有者 在以下示例中, myComApp 版本 1 拥有清单文件。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      <assemblyIdentity type="win32"
                        name="myOrganization.myDivision.myComApp"
                        version="1.0.0.0"
                        processorArchitecture="msil"
      />
    </assembly>
    
  4. 标识依赖程序集。 在下面的示例中, myComApp 取决于 myManagedComp.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      <assemblyIdentity type="win32"
                        name="myOrganization.myDivision.myComApp"
                        version="1.0.0.0"
                        processorArchitecture="x86"
                        publicKeyToken="8275b28176rcbbef"
      />
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32"
                        name="myOrganization.myDivision.myManagedComp"
                        version="6.0.0.0"
                        processorArchitecture="X86"
                        publicKeyToken="8275b28176rcbbef"
          />
        </dependentAssembly>
      </dependency>
    </assembly>
    
  5. 保存并命名清单文件。 应用程序清单的名称是程序集可执行文件的名称,后加上 .manifest 扩展名。 例如,myComApp.exe 的应用程序清单文件名 myComApp.exe.manifest。

可以在 COM 应用程序所在的同一目录中安装应用程序清单。 或者,可以将它作为资源添加到应用程序的 .exe 文件中。 有关详细信息,请参阅 “关于并行程序集”。

创建组件清单

  1. 使用 XML 编辑器创建组件清单来描述托管程序集。

  2. 在文件的开头插入以下标准标头:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    </assembly>
    
  3. 标识文件的所有者。 <assemblyIdentity>应用程序清单文件中元素的<dependentAssembly>元素必须与组件清单中的元素匹配。 在以下示例中, myManagedComp 版本 1.2.3.4 拥有清单文件。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
           <assemblyIdentity
                        name="myOrganization.myDivision.myManagedComp"
                        version="1.2.3.4"
                        publicKeyToken="8275b28176rcbbef"
                        processorArchitecture="msil"
           />
    </assembly>
    
  4. 在程序集内识别每个类。 使用 <clrClass> 元素唯一标识托管的程序集中的每个类。 该元素是元素的 <assembly> 子元素,具有下表中所述的属性。

    Attribute Description 必选
    clsid 指定要激活的类的标识符。 是的
    description 通知用户有关组件的字符串。 空字符串是默认值。
    name 一个表示托管类的字符串。 是的
    progid 要用于后期绑定激活的标识符。
    threadingModel COM 线程模型。 “两者”都是默认值。
    runtimeVersion 指定要使用的公共语言运行时 (CLR) 版本。 如果未指定此属性,并且尚未加载 CLR,则组件将在 CLR 版本 4 之前加载最新安装的 CLR。 如果指定 v1.0.3705、v1.1.4322 或 v2.0.50727,则版本会自动前滚到 CLR 版本 4(通常是 v2.0.50727)之前的最新安装的 CLR 版本。 如果已经加载了另一个版本的公共语言运行库,并且指定的版本能够与当前进程并行加载,则加载指定的版本;否则,将使用现有的公共语言运行库。 这可能会导致加载失败。
    tlbid 类型库的标识符,其中包含有关该类的类型信息。

    所有属性标记都区分大小写。 可以通过使用 OLE/COM ObjectViewer(Oleview.exe)查看程序集的导出类型库来获取 CLSID、ProgID、线程模型和运行时版本。

    以下组件清单标识两个类, testClass1 以及 testClass2

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
           <assemblyIdentity
                        name="myOrganization.myDivision.myManagedComp"
                        version="1.2.3.4"
                        publicKeyToken="8275b28176rcbbef"
           />
           <clrClass
                        clsid="{65722BE6-3449-4628-ABD3-74B6864F9739}"
                        progid="myManagedComp.testClass1"
                        threadingModel="Both"
                        name="myManagedComp.testClass1"
                        runtimeVersion="v1.0.3705">
           </clrClass>
           <clrClass
                        clsid="{367221D6-3559-3328-ABD3-45B6825F9732}"
                        progid="myManagedComp.testClass2"
                        threadingModel="Both"
                        name="myManagedComp.testClass2"
                        runtimeVersion="v1.0.3705">
           </clrClass>
           <file name="MyManagedComp.dll">
           </file>
    </assembly>
    
  5. 保存并命名清单文件。 组件清单的名称是程序集的名称,紧接着加上 .manifest 扩展名。 例如,myManagedComp.dll 为 myManagedComp.manifest。

必须将组件清单作为资源嵌入程序集中。

在托管程序集里嵌入组件清单

  1. 创建包含以下语句的资源脚本:

    1 RT_MANIFEST myManagedComp.manifest

    在此语句中, myManagedComp.manifest 是嵌入的组件清单的名称。 对于此示例,脚本文件名为 myresource.rc.

  2. 使用 Microsoft Windows 资源编译器(Rc.exe)编译脚本。 在命令提示符处,键入以下命令:

    rc myresource.rc

    Rc.exe 生成 myresource.res 资源文件。

  3. 再次编译程序集的源文件,并使用 /win32res 选项指定资源文件:

    /win32res:myresource.res

    同样, myresource.res 是包含嵌入资源的资源文件的名称。

另请参阅