COM 互操作性需要强命名程序集?

Posted

技术标签:

【中文标题】COM 互操作性需要强命名程序集?【英文标题】:Strong named assembly needed for COM interoperability? 【发布时间】:2017-08-28 13:45:16 【问题描述】:

我有几个没有强命名(签名)的 C# 程序集库。我想使用 tlbexp.exe 在这些组件上创建一个 SxS COM 包装器,以便在本机程序中使用。是否需要签名或有其他方法可以这样做?

谢谢

【问题讨论】:

为什么有 C++ 标签?我在您的帖子中没有看到任何对 C++ 语言的引用。此外,程序集和 COM 不是 C++ 标准语言的一部分。 【参考方案1】:

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

这是一个麻烦的秘诀,就像您在创建库时使用什么语言或工具一样。当您对库进行更改并且客户端程序员必须重新构建和重新部署使用您的库的程序时,麻烦就开始了。

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

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

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

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

【讨论】:

【参考方案2】:

当一个程序集被强命名时,它的类型只能从其他强命名程序集中使用。由于您的程序集没有强命名,因此无需签署您的 COM 包装器。

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

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

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

【讨论】:

以上是关于COM 互操作性需要强命名程序集?的主要内容,如果未能解决你的问题,请参考以下文章

创建了对嵌入的互操作程序集间接引用,无法嵌入互操作类型

COM 互操作 (CCW) 中的重载 - IDispatch 名称包括后缀(_2、_3 等)

使用 CSC 编译 C# 代码 - excel 互操作

64 到 32 位互操作 - 如何?

Office 互操作程序集 Windows 10

无法将 Microsoft Office 互操作程序集添加到项目