为什么regasm警告我用强有力的名字签名?

时间:2011-02-01 16:05:07

标签: .net com assemblies regasm snk

如果我想将.NET程序集用作COM服务器,我必须添加一组属性,然后使用regasm将其注册为COM服务器。

如果使用regasm密钥运行时未使用强名称/codebase对程序集进行签名,则会显示RA0000警告,说明程序集可能会干扰程序集上的其他程序集电脑我应该用一个强有力的名字签名,但注册成功,它甚至可以正常工作。

AFAIK强名称旨在防止所谓的DLL地狱。但COM也是为了防止DLL地狱。如果我更改任何暴露给COM的接口,我必须更改GUID或至少保持二进制兼容性。因此,使用强名称进行签名似乎并没有增加任何有用的东西 - 没有什么能阻止我破坏COM接口,然后使用相同的密钥对进行签名并拥有完整的DLL地狱。

在COM暴露的.NET程序集的情况下,使用强名称签名有什么用?

3 个答案:

答案 0 :(得分:7)

这是一个笨拙的警告。 COM DLL地狱有两个方面。真正糟糕的是修改公共接口而不是分配新的GUID。没有重新编译的客户端应用程序在调用完全错误的方法时会崩溃并烧毁,或者使用令人讨厌的AccessViolationException进行炸弹,而这些异常无法解释原因可能是什么。

第二个是做正确的事情(分配新的GUID),然后用新版本覆盖现有的DLL。你仍然会崩溃这个陈旧的客户端应用程序,但更温和地使用E_NOINTERFACE hresult会产生一个非常特殊的异常,帮助你诊断原因。但用户并不高兴。

场景在.NET中有一个现成的解决方案,GAC支持并行部署具有不同版本号的程序集,以便旧版本和新版本可以共存并且过时的客户端应用程序继续对旧版本感到满意。这需要一个强大的名字。是的,当您使用/ codebase时,该警告肯定会被禁止,因为这很清楚您不会使用GAC。虽然使用/ codebase稍微调整一下你的鼻子也没什么坏处。此外,您在测试时从不在开发机器上使用GAC,但在部署时当然应该考虑它。

答案 1 :(得分:2)

据我所知,COM并不是为了防止DLL地狱,它是哈迪斯本身的陷阱。术语“DLL Hell”来自多个库的问题,每个库都具有相同命名的方法。在系统注册表中注册COM程序集对运行时的解析没有帮助。

对要充当COM服务器的程序集进行签名可确保程序集不会与同一台计算机上的其他COM注册程序集发生冲突。如果没有签名,如果两个COM注册的程序集具有相同名称的方法,则可能会导致问题。

答案 2 :(得分:1)

强命名主要用于将Dll放入GAC。因此,您可以在同一台计算机上安全地使用具有相同名称(!)的多个版本的Dll,这些版本的常规COM-Dll通常会产生问题。不签署Dll会删除GAC的能力。您没有任何直接问题,但是您没有使用有用的功能,因此您会收到警告。