8

我们有一组用 VC++ 开发的 COM 组件。当对此类组件的引用添加到 .NET 项目时,Visual Studio 会生成一个互操作程序集。我们现在有一组这样的程序集。

在运行我们的日常构建时,我们使用数字签名对所有生成的二进制文件进行签名。互操作程序集没有签名,因为我们不认为我们是作者 - 任何人都可以使用 Visual Studio 并生成相同的程序集。

我们是否也应该签署互操作程序集?我们是否也应该使用强名称(sn.exe 实用程序)对它们进行签名?这样做的原因是什么?

4

3 回答 3

8

一段时间以来,这一直是一个棘手的平衡。问题在于您需要将 Interop 程序集与您的代码一起分发,并且您可能正在对自己的程序集进行签名。如果您对程序集进行签名,则它引用的所有程序集也必须签名 - 包括互操作程序集。所以你必须签署他们。

如果您正在分发一个独立的应用程序,那么没有风险,您应该继续签署程序集以使您的生活更轻松。

如果您正在分发组件库,事情可能会有点棘手,因为使用您的库的另一个开发人员可能会生成他们自己的互操作程序集,但使用他们自己的密钥对其进行签名。这会导致各种命名和依赖问题。

根据您的互操作程序集的复杂程度,您可以将代理代码生成到单独的 .CS/.VB 文件中,然后将其直接编译到您的程序集中。这样您就不必担心强名称问题。

于 2009-04-28T09:23:07.117 回答
3

我们使用 Sn.exe 将工具生成的互操作程序集强命名为 COM 对象的包装器。我们需要这样做,因为加载它们的程序集已签名,因此需要对其进行签名。

要生成我们使用的互操作程序集:

tlbimp Some_COM.dll /delaysign /publickey:"Some_PublicKey.snk" /out:Some_COM2Lib.dll"

如果您完全签名,显然删除 /delaysign 。

至于不编写程序集,可能是这种情况,但您应对它们负责。您希望确保它们不会被其他任何人(无意或无意)替换,因此您可能应该应用与应用于其他代码相同级别的签名/强名称。

于 2009-04-28T09:26:02.850 回答
0

将“publickey”替换为“keyfile”:

tlbimp Some_COM.dll /delaysign /keyfile:"Some_PublicKey.snk" /out:Some_COM2Lib.dll"
于 2013-11-15T19:51:07.950 回答