1

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

我一直在尝试通过导出注册表补丁并使用以下命令导入它来使其正常工作:

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

但是,应用补丁并不能正确注册组件。我可以直接使用 regasm 注册它。我是管理员。regasm 在做什么,它没有写入注册表补丁?

4

1 回答 1

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}. 打开 regedit 并找到此键。
  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 上也可以启用注册表反射,从而确保条目安装在正确的位置。
于 2012-11-02T19:49:12.063 回答