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

Wug*_*Wug 2 com-interop regasm

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

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

regasm /regfile:foo.reg Server.exe
reg import foo.reg
Run Code Online (Sandbox Code Playgroud)

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

Wug*_*Wug 5

这是因为 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 上也将启用注册表反射,从而确保条目安装在正确的位置。