程序集注册工具 (Regasm.exe)

本文介绍如何使用程序集注册工具Regasm.exe将.NET Framework程序集注册到COM中,包括命令行参数说明、注册表项解释及示例。

前些天有个网友说win7不能因用word名称空间,添加了Microsoft Word 12.0 Object Library还是不行。

 

程序集注册工具(Regasm.exe)读取程序集中的元数据,并将所需的项添加到注册表中。

 

注册表允许 COM 客户程序以透明方式创建 .NET Framework 类。类一经注册,任何 COM 客户程序都可以使用它,就好像该类是一个 COM 类。类仅在安装程序集时注册一次。程序集中的类实例直到被实际注册时,才能从 COM 中创建。

 

 

备注

可以使用 /regfile 选项生成包含注册表项的 .reg 文件,而不是直接对注册表进行更改。通过注册表编辑器工具 (Regedit.exe) 导入 .reg 文件,可以在计算机上更新注册表。请注意,.reg 文件不包含任何可由用户定义的注册函数完成的注册表更新。注意,/regfile 选项只为托管类发出注册表项。此选项不为 TypeLibID 或 InterfaceID发出注册表项。

 

指定 /tlb 选项时,Regasm.exe 生成并注册一个类型库,对在程序集中找到类型进行描述。Regasm.exe 将生成的类型库放到当前的工作目录中或为输出文件指定的目录中。为引用其他程序集的程序集生成类型库可能导致同时生成几个类型库。可使用类型库向开发工具(如 Visual Studio 2005)提供类型信息。如果正在注册的程序集是由类型库导入程序 (Tlbimp.exe) 产生的,则不应使用 /tlb 选项。如果程序集是从类型库导入的,则不能从它导出类型库。除了类型库导出程序 (Tlbexp.exe) 不能注册它产生的类型库外,使用 /tlb 选项同使用 Tlbexp.exe 和 Regasm.exe 的效果相同。如果使用 /tlb 选项注册某个类型库,则可将 /tlb 选项和 /unregister 选项一起使用,以注销该类型库。将两个选项一起使用将注销类型库和接口项,这样可较大程度地清理注册表。

 

当您注册一个程序集供 COM 使用时,Regasm.exe 会在本地计算机的注册表中添加一些项。更具体地说就是,它创建与版本相关的注册表项,这些项允许在一台计算机上并行运行同一程序集的多个版本。第一次注册程序集时,会为该程序集创建一个顶级项并为这个程序集版本创建一个唯一的子项。每次注册该程序集的新版本时,Regasm.exe 都为新版本创建一个子项。

例如,假设您要注册一个版本为 1.0.0.0 的托管组件 myComp.dll 供 COM 使用。后来,您又注册版本为 2.0.0.0 的 myComp.dll。您确定计算机上的所有 COM 客户端应用程序都要使用 2.0.0.0 版本的 myComp.dll,并且决定注销 myComponent.dll 版本 1.0.0.0。此注册表方案允许您注销 myComp.dll 版本 1.0.0.0,这是因为注销操作只移除 1.0.0.0 版本子项。

使用 Regasm.exe 注册程序集之后,可以将该程序集安装在全局程序集缓存中,以便可以从任何 COM 客户端激活它。如果程序集仅准备由单个应用程序激活,则可以将它放到该应用程序的目录中。

 

 

 

示例

下面的命令注册 myTest.dll 中包含的所有公共类。

regasm myTest.dll

下面的命令生成文件 myTest.reg,该文件包含所有必要的注册表项。此命令不更新注册表。

regasm myTest.dll /regfile:myTest.reg

下面的命令注册 myTest.dll 中包含的所有公共类,并生成和注册类型库 myTest.tlb,该类型库包含 myTest.dll 中定义的所有公共类型的定义。

regasm myTest.dll /tlb:myTest.tlb
     
向 COM 注册程序集

 

您可以运行一个叫做程序集注册工具 (Regasm.exe) 的命令行工具来注册或注销与 COM 一起使用的程序集。Regasm.exe 会将有关类的信息添加到系统注册表中,以便 COM 客户端透明地使用 .NET 类。RegistrationServices 类提供了等效的功能。

必须先在 Windows 注册表中注册托管组件,然后才可以从 COM 客户端将其激活。下表显示 Regasm.exe 通常添加到 Windows 注册表中的注册表项。(000000 指示实际 GUID 值。)

GUID说明注册表项

CLSID

类标识符

HKEY_CLASSES_ROOT/CLSID/{000…000}

IID

接口标识符

HKEY_CLASSES_ROOT/Interface/{000…000}

LIBID

库标识符

HKEY_CLASSES_ROOT/TypeLib/{000…000}

ProgID

编程标识符

HKEY_CLASSES_ROOT/000…000

在 HKCR/CLSID/{0000...0000} 项下,默认值设置为类的 ProgID,并且会添加两个新的命名值:“类”值和“程序集”值。运行库将从注册表中读取“程序集”值,并将其传递给运行库程序集冲突解决程序。程序集冲突解决程序将根据程序集信息(如名称和版本号)尝试查找程序集。为便于程序集冲突解决程序查找程序集,程序集必须位于以下某一位置中:

  • 全局程序集缓存(必须是强名称的程序集)。

  • 在应用程序目录中。从应用程序路径加载的程序集只能通过该应用程序进行访问。

  • 沿使用 /codebase 选项指定的、指向 Regasm.exe 的文件路径。

Regasm.exe 还会在 HKCR/CLSID/{0000...0000} 项下创建 InProcServer32 项。该键的默认值设置为初始化公共语言运行库的 DLL 的名称 (Mscoree.dll)。

检查注册表项

COM Interop 提供了标准的类工厂实现来创建任何 .NET Framework 类的实例。客户端可以通过对托管 DLL 调用 DllGetClassObject 来获取类工厂并创建对象,就像处理其他任何 COM 组件一样。

对 Mscoree.dll 的引用将替代传统的 COM 类型库,以指示公共语言运行库创建托管对象。

注册表项

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值