如果我想让 .NET 程序集可用作 COM 服务器,我必须添加一组属性,然后使用regasm
将其注册为 COM 服务器。
如果程序集未使用强名称签名regasm
当运行时/codebase
键显示一个RA0000
警告说大会可能会干扰同一台计算机上的其他程序集我应该用一个强名字来签名,但注册成功了,甚至工作得很好。
AFAIK 强名称旨在防止所谓的 DLL 地狱。但 COM 的目的也是为了防止 DLL 地狱。如果我更改暴露给 COM 的任何接口,我必须更改 GUID 或至少保持二进制兼容性。因此,使用强名称签名似乎并没有添加任何有用的东西 - 没有什么可以阻止我破坏 COM 接口,然后使用相同的密钥对进行签名并拥有成熟的 DLL 地狱。
对于 COM 公开的 .NET 程序集,使用强名称签名有什么用?
这是一个笨拙的警告。 COM DLL Hell 有两个方面。真正糟糕的是修改公共接口而不是分配新的 GUID。未重新编译的客户端应用程序在调用完全错误的方法或使用令人讨厌的 AccessViolationException 进行轰炸时往往会崩溃并烧毁,而根本不知道原因可能是什么。
第二种是正确执行所有操作(分配新的 GUID),然后用新版本覆盖现有 DLL。您仍然会导致过时的客户端应用程序崩溃,但使用 E_NOINTERFACE hresult 会更温和地崩溃,该结果会生成非常具体的异常,帮助您诊断原因。但用户并没有感到更高兴。
That该场景在 .NET 中有一个现成的解决方案,GAC 支持并行部署具有不同版本号的程序集,以便新旧版本可以共存,并且过时的客户端应用程序继续使用旧版本。这需要一个响亮的名字。是的,当您使用 /codebase 时,该警告肯定会被抑制,因为这清楚地表明您不会使用 GAC。尽管在使用 /codebase 时稍微调整一下你的鼻子并没有什么坏处。此外,您在测试时永远不会在开发计算机上使用 GAC,但在部署时当然应该考虑它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)