2011-02-01 528 views
6

如果我想使.NET程序集可用作COM服务器,我必须添加一组属性,然后使用regasm将其注册为COM服务器。regasm为什么会提醒我用强名称签名?

如果组件不与时/codebase键运行强名称regasm签署显示了RA0000警告说,大会可以与其他组件在同一台计算机的干扰,我应该使用强名称签名,但注册成功,甚至可以正常工作。

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

在COM公开的.NET程序集的情况下使用强名称进行签名有什么用?

回答

7

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

第二个正在做的一切正确(分配新的GUID),但随后用新版本覆盖现有的DLL。您仍然会崩溃该陈旧的客户端应用程序,但更温和地使用E_NOINTERFACE hresult生成一个相当特定的异常,可帮助您诊断原因。但用户并不高兴。

方案在.NET中有一个现成的解决方案,GAC支持并排侧有不同的版本号部署组件,这样无论是旧的和新版本可以共存和陈旧的客户端应用程序继续对旧版本感到满意。这需要一个强大的名字。是的,当您使用/ codebase时,该警告肯定会被抑制,因为这很清楚您不会使用GAC。尽管在使用/代码库时稍微调整一下你的鼻子并不会伤害到它。另外,在测试时,您绝对不会在开发机器上使用GAC,但在部署时肯定应该考虑它。

1

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

2

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

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

相关问题