基于 .NET Framework 的组件的无注册激活比 COM 组件要复杂一些。 安装程序需要两个清单:
COM 应用程序必须具有 Win32 样式的应用程序清单才能标识托管组件。
基于 .NET Framework 的组件必须具有组件清单,才能在运行时获取所需的激活信息。
本主题介绍如何将应用程序清单与应用程序相关联;将组件清单与组件相关联;并在程序集中嵌入组件清单。
创建应用程序清单
使用 XML 编辑器创建(或修改)COM 应用程序拥有的应用程序清单,该应用程序与一个或多个托管组件进行互作。
在文件的开头插入以下标准标头:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> </assembly>有关清单元素及其属性的信息,请参阅 应用程序清单。
识别清单所有者 在以下示例中,
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>标识依赖程序集。 在下面的示例中,
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>保存并命名清单文件。 应用程序清单的名称是程序集可执行文件的名称,后加上 .manifest 扩展名。 例如,myComApp.exe 的应用程序清单文件名 myComApp.exe.manifest。
可以在 COM 应用程序所在的同一目录中安装应用程序清单。 或者,可以将它作为资源添加到应用程序的 .exe 文件中。 有关详细信息,请参阅 “关于并行程序集”。
创建组件清单
使用 XML 编辑器创建组件清单来描述托管程序集。
在文件的开头插入以下标准标头:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> </assembly>标识文件的所有者。
<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>在程序集内识别每个类。 使用
<clrClass>元素唯一标识托管的程序集中的每个类。 该元素是元素的<assembly>子元素,具有下表中所述的属性。Attribute Description 必选 clsid指定要激活的类的标识符。 是的 description通知用户有关组件的字符串。 空字符串是默认值。 否 name一个表示托管类的字符串。 是的 progid要用于后期绑定激活的标识符。 否 threadingModelCOM 线程模型。 “两者”都是默认值。 否 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>保存并命名清单文件。 组件清单的名称是程序集的名称,紧接着加上 .manifest 扩展名。 例如,myManagedComp.dll 为 myManagedComp.manifest。
必须将组件清单作为资源嵌入程序集中。
在托管程序集里嵌入组件清单
创建包含以下语句的资源脚本:
1 RT_MANIFEST myManagedComp.manifest在此语句中,
myManagedComp.manifest是嵌入的组件清单的名称。 对于此示例,脚本文件名为myresource.rc.使用 Microsoft Windows 资源编译器(Rc.exe)编译脚本。 在命令提示符处,键入以下命令:
rc myresource.rcRc.exe 生成
myresource.res资源文件。再次编译程序集的源文件,并使用 /win32res 选项指定资源文件:
/win32res:myresource.res同样,
myresource.res是包含嵌入资源的资源文件的名称。