创建强命名托管 (/clr) C++ 程序集

Posted

技术标签:

【中文标题】创建强命名托管 (/clr) C++ 程序集【英文标题】:Creating a strongly-named managed (/clr) C++ assembly 【发布时间】:2011-07-04 07:09:53 【问题描述】:

我有一个使用 /clr 开关的托管 C++ 程序集,我尝试按照 this question 使用以下构建后步骤进行签名:

sn -Ra "$(TargetPath)" MyKey.snk

但是这会出现以下错误:

C:\Path\Assembly.dll does not represent a strongly named assembly

出了什么问题?

【问题讨论】:

【参考方案1】:

您是否在 AssemblyInfo.cpp 中将程序集标记为延迟签名?

[assembly:AssemblyKeyFileAttribute("MyKey.snk")];
[assembly:AssemblyDelaySignAttribute(true)];

【讨论】:

托管 C++ 程序集中的哪个位置? 见here 太烦人了,这是/没有记录。花了两天多的时间试图弄清楚为什么这在切换到 32 位配置时不起作用,但在 64 位时不需要。【参考方案2】:

我最终想出了这个-根据链接的问题,我不能只设置Linker/Advanced/KeyFile 选项并期望它起作用-我需要使用sn.exe 来签署程序集,但是我 仍然需要设置Linker/Advanced/KeyFile 选项。

简而言之,要签署 /clr 程序集,您需要两者:

    Linker/Advanced/KeyFile 属性页面中指定密钥文件 使用sn.exe 签署程序集作为构建后步骤

(我相信使用[assembly:AssemblyKeyFileAttribute("MyKey.snk")]相当于在项目属性对话框中设置keyfile)。

【讨论】:

它应该可以工作,但有时它不能,你必须使用属性。【参考方案3】:

marked answer 帮助达成了最终解决方案(因此它收到了我的 +1)。

但是不得不花费数分钟的时间来弄清楚如何在 VS2010 中创建AssemblyInfo.cpp

以下是该问题的“更多”完整答案。

#include "stdafx.h"

using namespace System;
using namespace System::Reflection;
using namespace System::Runtime::CompilerServices;
using namespace System::Runtime::InteropServices;
using namespace System::Security::Permissions;

[assembly:AssemblyKeyFileAttribute("YourAssembly.snk")];
[assembly:AssemblyDelaySignAttribute(true)];

然后作为构建后步骤,运行 sn -Ra YourAssembly.dll YourAssembly.snk

【讨论】:

我需要在 [assembly] 属性之后使用分号。

以上是关于创建强命名托管 (/clr) C++ 程序集的主要内容,如果未能解决你的问题,请参考以下文章

4.3 命名空间和程序集

CLR详解CLR中的程序集

CLR的执行模型(2):将托管模块合并成程序集

第三章 共享程序集和强命名程序集

如何在运行时使用 C# 创建强类型数据集?

应用程序集和CLR 垃圾回收