为什么Regasm会警告我使用强名称进行签名?

8
如果我想将一个.NET程序集用作COM服务器,我需要添加一组属性,然后使用regasm将其注册为COM服务器。
如果该程序集没有使用强名称签名,在使用/codebase键运行regasm时,会显示一个RA0000警告,指出该程序集“可能会干扰同一台计算机上的其他程序集”,并建议我对其进行强名称签名,但是注册仍然成功,并且它甚至可以正常工作。
据我所知,强名称旨在防止所谓的DLL地狱。但是,COM也旨在防止DLL地狱。如果我更改向COM公开的任何接口,则必须更改GUID或至少保持二进制兼容性。因此,使用强名称签名似乎没有添加任何有用的内容-没有任何东西可以防止我破坏COM接口,然后使用相同的密钥对进行签名并拥有完整的DLL地狱。
在.NET程序集暴露给COM时,强名称签名有什么用处呢?
3个回答

8
这是一条笨拙的警告。COM DLL Hell有两个方面。其中一个是修改公共接口但不分配新GUID,这很糟糕。如果客户端没有重新编译,则通常会崩溃或产生非常令人讨厌的AccessViolationException异常,根本不知道原因。另一个方面是做得正确(分配新GUID),但是用新版本覆盖现有DLL。你仍然会造成那些陈旧的客户端应用程序崩溃,但会更温和地产生生成一个相当具体的异常E_NOINTERFACE,帮助您诊断原因。但用户仍然不会很开心。
在.NET中,这种情况可以通过GAC进行解决,支持使用不同版本号的程序集进行并行部署,使旧版本和新版本都能共存,而陈旧的客户端应用程序继续使用旧版本。需要强名称。是的,当您使用/codebase时,这条警告肯定可以被屏蔽,因为它非常清楚您不打算使用GAC。尽管在使用/codebase时,调整您的鼻子可能没有坏处。此外,在测试时,您永远不会在开发计算机上使用GAC,但在部署时应该考虑。

如果您在一个封闭的系统中部署,是否仍需要分配新的GUID?我有一个已知用户集的应用程序,其中COM库仅被一个应用程序使用。到目前为止,注销旧版本然后注册新版本似乎是有效的,但我不知道是否会因此而引发其他问题。 - undefined

3
据我所知,COM并不是为了防止DLL地狱而设计的,它本身就是地狱。"DLL Hell"这个术语源于多个库具有相同命名方法的问题。在系统注册表中注册COM程序集不能帮助解决运行时的冲突。
签署旨在充当COM服务器的程序集可以确保该程序集不会与同一计算机上注册的其他COM程序集发生冲突。如果没有签名,如果两个已注册的COM程序集具有相同名称的方法,则可能会导致问题。

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接