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

sha*_*oth 7 .net com assemblies snk regasm

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

如果在regasm使用/codebasekey 运行时未使用强名称对程序集进行签名,则会显示一条RA0000警告,指出程序集可能会干扰同一台计算机上的其他程序集,并且我应该使用强名称对其进行签名,但是注册成功,它甚至可以正常工作.

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

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

Han*_*ant 7

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

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

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