2017-08-28 69 views
2

我有几个C#汇编库,它们没有强烈命名(签名)。我想使用tlbexp.exe在这些组件上制作一个SxS COM包装器以在本机程序中使用。是否有必要签署他们或有另一种方式来做到这一点?COM互操作性需要强命名程序集吗?

由于

+0

为什么你有C++标签?我的帖子中没有提及C++语言。另外,程序集和COM不是C++标准语言的一部分。 –

回答

0

当组件被强命名,其类型只能从其他强命名组件中使用。由于你的程序集没有强命名,所以不需要签名你的COM包装器。

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

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

由于您希望通过SxS /免注册激活部署您的COM包装器,因此完全绕过注册表和GAC,因此实际上不需要对其进行签名。

2

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

这是一个麻烦的秘诀,就像无论您在创建库时使用何种语言或工具。当您在库中进行更改时,这种麻烦开始,客户端程序员必须重新构建并重新部署使用您的库的程序。

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

客户端程序员不更新的程序需要继续使用旧版本的库,因此它不受更改影响。换句话说,需要在用户机器上有多个DLL副本,并且程序自动需要选择正确的DLL。

谢天谢地,这对于[ComVisible] .NET程序集很容易做到。客户程序员,他的用户或您为他提供的安装程序都可以将程序集放入GAC。它允许程序集的多个副本并排存在,并且CLR可以自动找到正确的一个。这有两个的要求。你需要碰撞你的库的[AssemblyVersion],这是标准的。该程序集需要有一个强大的名称,以便可以放入GAC中。这很简单,你可以使用Project> Properties> Signing并勾选“Sign the assembly”复选框。这没有安全隐患,因此密钥无关紧要,并且密码是完全不必要的。这是而不是容易由客户端程序员做,所以这是你必须做的事情。总是。

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