1

我想往返一个公开 COM 对象(互操作)的 dll。使用 ildasm 我转储了 dll。在 ildasm 转储中,我重命名了所有出现的类名。带有 DLL 开关和包含资源的 Ilasm 生成了新的 dll。我不知道如何注册这个新的 dll (Win7)。Regasm/Regedit 抱怨一个强名称。我还需要调整什么?谢谢你。塞佩

4

1 回答 1

3

程序集的强名称会显式阻止您执行此操作。强名称旨在检测有人篡改程序集的代码,当程序集存储在网站等不安全的位置时很有用。您肯定在篡改 DLL,因此您将破坏强名称。辞职是必需的,并且需要访问最初使用的私钥。

也就是说,在 [ComVisible] 程序集的特定情况下有一些缓解因素。应用程序无法验证强名称,因为此类程序集的客户端是不知道 bean 的强名称的本机代码。只有在 GAC 中注册程序集时才需要强名称。这通常是此类程序集的好地方,因为它有助于避免 DLL Hell。

所以你可以做两件事来解决这个问题:

  • 仔细阅读 regasm.exe 消息。如果您使用 /codebase 选项,它可能只会显示警告。“RegAsm:警告 RA0000:向 /codebase 注册未签名的程序集可能会导致您的程序集干扰可能安装在同一台计算机上的其他应用程序。/codebase 开关旨在仅用于已签名的程序集。请给您的程序集一个强名称并重新注册。” 这实际上意味着“您将致力于 DLL Hell”。DLL Hell 有不同程度,DLL 的名称+位置比较温和。更重要的是接口和类获得了一个新的 [Guid]。假设原始代码中不存在 [Guid] 属性,它们会在您更改名称后自动获得。

  • 只需使用 sn.exe 使用您自己的密钥对程序集进行签名。由于没有人可以真正检查强名称,因此任何一个都足够了。

请密切注意,[ComVisible] 接口和类名的实际名称在 COM 中无关紧要。只有 [Guid] 很重要,这就是 COM 客户端用来查找类型的内容。

于 2013-01-29T11:13:26.307 回答