如何在安装过程中正确注册.NET程序集而不调用RegAsm?

时间:2012-11-02 18:42:19

标签: com-interop regasm

我有一个.NET COM可见的进程外服务器,我们称之为Server.exe。我需要能够在可能安装了不同版本的.NET框架的系统上注册它,所以我想避免使用它的全名(它往往包含.NET框架的版本号)来调用RegAsm。

我一直在尝试通过导出注册表补丁并使用以下命令将其导入:

regasm /regfile:foo.reg Server.exe
reg import foo.reg

但是,应用修补程序无法正确注册组件。我可以直接使用regasm注册它。我是管理员。如果没有写入注册表补丁,那么什么是诅咒?

1 个答案:

答案 0 :(得分:4)

这是因为RegAsm被破坏,并且通过注册表修补在常规注册和延期注册之间不一致,并且由于其量子性质,它将根据请求的行为产生不同的注册表项。使用RegAsm来模拟进程内和进程外服务器的叠加之间的量子计算还有待探索。

要解决此问题:

  1. 使用RegAsm /regfile:foo.reg Server.exe生成注册表修补程序。
  2. 使用RegAsm /register Server.exe正确注册类型。
  3. 在记事本中打开foo.reg。 foo.reg中指定的几个键将具有格式为HKEY_CLASSES_ROOT\CLSID\{YOUR-CLSID}的路径。打开注册表并找到此密钥。
  4. 将此密钥导出为bar.reg并在记事本中将其打开。
  5. 将bar.reg中的所有条目复制到foo.reg,并从foo.reg中删除任何现有条目,这些条目将值添加到HKEY_CLASSES_ROOT\CLSID\{YOUR-CLSID}的任何部分。

    • 请记住,如果您使用的是64位系统,注册表重定向可能意味着此密钥存储在HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{YOUR-CLSID}而不是HKEY_CLASSES_ROOT\CLSID\{YOUR-CLSID}中。要确保在32位和64位系统上进行一致的部署,请从路径中删除Wow6432Node\(保留32位系统上的路径)并使用reg import foo.reg /reg:32将它们应用于注册表。 /reg:32是一个半文档化的开关,它应该适用于32位和64位版本的Windows,即使在64位版本的reg上也可以启用注册表反射,从而确保条目安装在正确的位置。