如何:对基于 .NET 的组件配置免注册激活
更新:2007 年 11 月
免注册激活对于基于 .NET 的组件仅比对于 COM 组件稍微复杂一些。安装程序需要两个清单:
COM 应用程序必须有一个 Win32 样式的应用程序清单,用于标识托管组件。
基于 .NET 的组件必须有一个包含运行时所需激活信息的组件清单。
本主题讲解如何将应用程序清单与应用程序关联起来;如何将组件清单与组件关联起来;以及如何在程序集中嵌入组件清单。
创建应用程序清单
对于与一个或多个托管组件交互操作的 COM 应用程序,使用 XML 编辑器创建(或修改)该应用程序拥有的应用程序清单。
在文件开头插入以下标准头:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
如想查看清单元素及其属性的信息,请在 MSDN Library 中搜索“应用程序清单参考”。
确定该清单的所有者。在下面的示例中,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="x86" />
确定相关程序集。在下面的示例中,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" language="*" /> </dependentAssembly> </dependency> </assembly>
保存并命名清单文件。应用程序清单的名称是在程序集可执行文件名的后面加上 .manifest 扩展名。例如,myComApp.exe 的应用程序清单文件的名称为 myComApp.exe.manifest。
可将应用程序清单与 COM 应用程序安装在相同的目录中。或者,也可将其作为资源添加到应用程序的 .exe 文件中。如想查看其他信息,请在 MSDN Library 中搜索“并行程序集”。
创建组件清单
使用 XML 编辑器创建一个组件清单来描述托管程序集。
在文件开头插入以下标准头:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
确定该文件的所有者。应用程序清单文件中 <dependentAssembly> 元素下的 <assemblyIdentity> 元素必须与组件清单中的 <assemblyIdentity> 元素相匹配。在下面的示例中,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"
确定程序集中的各个类。使用 <clrClass> 元素可以唯一地标识托管程序集中的各个类。该元素是 <assembly> 元素的子元素,它具有下表所示的属性。
属性
说明
必需
clsid
指定要激活的类的标识符。
是
description
用于向用户提供组件信息的字符串。默认为空字符串。
否
name
表示该托管类的字符串。
是
progid
用于后期绑定激活的标识符。
否
threadingModel
COM 线程模型。默认值为“Both”。
否
runtimeVersion
将忽略此属性。如果尚未加载运行库,将在激活该类之前加载最高的版本。否则,将使用当前加载的版本。
否
tlbid
包含有关该类的类型信息的类型库的标识符。
否
所有属性标记均区分大小写。可以通过使用 OLE/COM ObjectViewer (Oleview.exe) 查看导出的类型库来获取 CLSID、ProgID、线程模型,以及运行库版本。
以下组件清单标识一个具有两个方法的类。
<?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。
必须将组件清单作为资源嵌入程序集。
在托管程序集中嵌入组件清单
创建包含以下语句的资源脚本:
RT_MANIFEST 1 myManagedComp.manifest
在这条语句中,myManagedComp.manifest 是要嵌入的组件清单的名称。此示例中,脚本文件名是 myresource.rc。
用 Microsoft Windows 资源编译器 (Rc.exe) 编译脚本。在命令提示处,键入下列命令:
rc myresource.rc
Rc.exe 产生 myresource.res 资源文件。
再次编译该程序集的源文件,并使用 /win32res 选项指定资源文件:
/win32res:myresource.res
同样,myresource.res 是包含嵌入的资源的资源文件的名称。