.net 为什么regasm会警告我不要用强名称签名?

.net 为什么regasm会警告我不要用强名称签名?,.net,com,assemblies,regasm,snk,.net,Com,Assemblies,Regasm,Snk,如果我想使.NET程序集可用作COM服务器,我必须添加一组属性,然后使用regasm将其注册为COM服务器 如果程序集在使用/codebase运行时未使用强名称regasm签名,则键会显示一条RA0000警告,指出该程序集可能会干扰同一台计算机上的其他程序集,我应该使用强名称对其进行签名,但注册成功,甚至可以正常工作 AFAIK强名称旨在防止所谓的DLL地狱。但COM也意味着防止DLL地狱。如果我更改任何暴露于COM的接口,我必须更改GUID或至少保持二进制兼容性。因此,使用强名称签名似乎并没有

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

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

AFAIK强名称旨在防止所谓的DLL地狱。但COM也意味着防止DLL地狱。如果我更改任何暴露于COM的接口,我必须更改GUID或至少保持二进制兼容性。因此,使用强名称签名似乎并没有添加任何有用的内容——没有什么可以阻止我破坏COM接口,然后使用相同的密钥对签名并拥有完整的DLL地狱


在COM公开的.NET程序集中,使用作为强名称签名有什么用?

强名称主要用于将DLL放入GAC。因此,您可以在同一台计算机上安全地使用具有相同名称(!)的多个版本的Dll,而使用常规COM Dll通常会产生问题。未对DLL进行签名会删除对其进行GAC的功能。你不会因此而立即遇到任何问题,但你没有使用一个有用的功能,所以你会得到一个警告。

据我所知,COM并不是为了阻止DLL地狱,它本身就是地狱之坑。术语“DLL地狱”来自多个库的问题,每个库都有相同的命名方法。在系统注册表中注册COM程序集无助于在运行时解析


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

这是一个笨拙的警告。COM DLL地狱有两个方面。真正糟糕的是修改公共接口而不分配新的guid。未重新编译的客户端应用程序在调用一个完全错误的方法或引发严重的AccessViolationException时往往会崩溃并烧毁,而AccessViolationException根本不知道原因是什么

第二种方法是一切正常(分配新的guid),然后用新版本覆盖现有的DLL。您仍然会使陈旧的客户端应用程序崩溃,但更温和的是,使用E_NOINTERFACE hresult会生成一个非常特定的异常,帮助您诊断原因。不过,用户并没有感到更快乐

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