COM互操作性需要强名称汇编?

时间:2017-08-28 13:45:17

标签: c# c++ com

我有几个C#汇编库,它们没有强名称(签名)。我想使用tlbexp.exe在本机程序中使用这些组件上的SxS COM包装器。是否有必要签名或有其他方式吗?

由于

2 个答案:

答案 0 :(得分:2)

这个问题存在很强烈的误解,它使两个程序员的角色混淆不清。您是该图书馆的作者,其他人使用您的图书馆,可能适用于其他公司,并且不知道您是谁。客户端程序员。您反过来不知道客户端程序员如何使用您的库,他编写了多少程序以及他如何在用户的计算机上部署您的库。你只运行Tlbexp.exe来帮助他编写代码。

这是一个麻烦的方法,就像你创建库时使用的是什么语言或工具一样。当您在库中进行更改并且客户端程序员必须重新构建并重新部署使用您的库的程序时,就会出现问题。

COM库中存在额外的问题,因为默认注册是机器范围的。如果您所做的更改是错误修复,那么使用您的库的所有客户端程序都会自动获得修复,这是非常好的。但是,如果更改中断并导致旧的客户端程序失败,那就不好了。标准的灾难是客户端程序员重建一些这个程序,但忘记或忽略了一些他不再维护的旧程序。最终用户通常是真正的受害者,他有一个崩溃的程序,但有两个程序员不认为这是他们需要解决的问题。

客户端程序员不更新的程序必须保持使用旧版本的库,这样它就不会受到更改的影响。换句话说,在用户计算机上需要有多个DLL副本,程序自动需要选择正确的副本。

值得庆幸的是,[ComVisible] .NET程序集很容易实现。客户端程序员,他的用户或您为他提供的安装程序可以将程序集放入GAC。这允许组件的多个副本并排存在,CLR可以自动找到正确的副本。这有两个要求。您需要碰撞库的[AssemblyVersion],这是标准的。并且程序集需要具有强大的名称,因此可以将其放入GAC中。使用Project>这对您来说是微不足道的。属性>签署并勾选“签署程序集”复选框。这没有安全隐患,因此密钥无关紧要,密码完全没必要。客户端程序员很容易做到 ,所以这是必须做的事情。总是

客户端程序员还可以选择使用带有清单的隔离COM(也称为“regfree COM”),可能就是你对“SxS COM-wrapper”的意思。有利的是,他编写的每个程序都有自己的DLL副本,默认情况下它在.NET中的工作方式。需要手动部署错误修复程序,但库中的更改不能破坏未维护的客户端程序。但这完全是他的选择,你无法做任何事情来确保这样做。你必须假设他没有使用它,而且他几乎肯定不会一开始就这样,所以你无法绕过强名的需要。

答案 1 :(得分:0)

当程序集强名称时,其类型只能用于其他强名称程序集。由于您的程序集没有强名称,因此无需对COM包装器进行签名。

签署程序集可以将其置于全局程序集缓存(GAC)中。这样做的好处是可以并排保留多个版本,而不会破坏现有客户端。

另一种方法是通过regasm /codebase开关使用Windows注册表。与设置经典COM组件的方式大致相同,此选项在系统范围内注册COM可见组件。

由于您希望通过SxS /免注册激活部署COM包装器,从而完全绕过注册表和GAC,因此无需签名。