如何ildasm / ilasm往返一个暴露COM对象的DLL

时间:2013-01-29 09:38:07

标签: com interop clr

我想要一个暴露COM对象(互操作)的dll往返。 随着ildasm我倾倒了dll。 在ildasm转储中,我重命名了类名的所有出现。 带有DLL开关的Ilasm和包含的资源产生了新的dll。 我不知道如何注册这个新的DLL(Win7)。 Regasm / Regedit抱怨名字很强。 我还需要调整什么? 谢谢。 Seppe

1 个答案:

答案 0 :(得分:3)

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

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

因此,您可以采取两项措施来解决此问题:

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

  • 使用sn.exe使用您自己的密钥对程序集进行签名。由于没有人能够检查强名称,所以任何一个都足够好。

并且密切关注球,[ComVisible]界面的实际名称和类名在COM中并不重要。只有[Guid]很重要,这就是COM客户端用来找回类型的内容。