【问题标题】:Unmanaged C++ - need strong name to be referenced by C++/CLI dll with strong name?非托管 C++ - 需要 C++/CLI dll 以强名称引用强名称?
【发布时间】:2012-07-18 22:51:38
【问题描述】:

我有一个非托管 C++ dll,将由托管 C++/CLI 包装器 .dll 使用,最终将由 C# 项目使用。

C# 项目是强命名的,包装器 .dll 也是。我尝试使用 /KEYFILE 对非托管 dll 执行相同的操作,但似乎不起作用。包装器在抱怨:

.... is a strong-name signed assembly and embedding a manifest invalidates the signature

我是否需要对非托管 C++ 进行强命名?如果没有,我该如何解决这个问题?

【问题讨论】:

  • C++ 没有“强名称”的概念。程序集及其名称(无论是否强大)不是 C++ 或基本 .dll 工作的一部分。它们是 .NET 结构。
  • 那么如何解决包装类中的构建警告以及尝试运行 C# 应用程序时的最终错误?

标签: c++ visual-studio-2010 strongname


【解决方案1】:

终于搞定了,即我的 C# 应用程序调用 C++/CLI 包装器 dll,它调用本机 C++ dll 中的一个类!

解决问题:

mt.exe : general warning 810100b3: ... MyWrapper.dll is a strong-name signed assembly and embedding a manifest invalidates the signature. You will need to re-sign this file to make it a valid assembly.

重要提示:事实证明,引用类中的强名称不是问题。

事实证明,在这种情况下,VS 对包装 dll 进行签名的方式有问题。见链接:http://blogs.msdn.com/b/vcblog/archive/2011/03/11/10140139.aspx

简而言之,为了解决这个问题,在您的包装 C++ 类中,将其添加为您的 Post Build 命令以重新签名:

sn.exe -R $(SolutionDir)$(Configuration)\MyWrapper.dll MyKeyFile.snk

【讨论】:

  • 如果 SN 要求输入密码,请在上面的“sn.exe”行前面加上 ECHO <your-password> | 以输入您的密码,根据我在此处的 SO 帖子:stackoverflow.com/questions/3138106/…
【解决方案2】:

无法对本机 DLL 进行强命名。最重要的是因为这样做毫无意义,只有 CLR 会验证强名称,并且只在 .NET 程序集上这样做。

以防万一:强名称​​不是代码签名证书的替代品。最大的暗示是因为您不必将一大笔钱交给任何人。

【讨论】:

  • 谢谢汉斯!这证实了我完全走错了方向:(你能给我另一个提示吗?我想我应该在我的包装器中做 [DllImport ...]。我在正确的轨道上吗?
  • 好吧,我想我解决了这个问题,只需让本机代码在 CLR 上运行(使用 /clr)。它仍然是非托管代码(因为我没有使用任何托管功能),但它在 .NET 上运行。这样我就可以强命名它。否则我需要使用 P/Invoke,我找到的唯一材料在这里:codeproject.com/Articles/14180/… 这似乎很涉及。
  • 签名实际上是免费的。您唯一需要支付的是开箱即​​用的 Windows 信任的签名证书。但对于企业用途,您可以使用仅供内部使用的证书。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 2020-12-27
  • 1970-01-01
相关资源
最近更新 更多