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

Jus*_*tin 9 .net c++ clr sign

我有一个托管C++程序集使用/clr我试图根据此问题签署的交换机,以及后面的构建后步骤:

sn -Ra "$(TargetPath)" MyKey.snk
Run Code Online (Sandbox Code Playgroud)

但是这会产生以下错误:

C:\Path\Assembly.dll does not represent a strongly named assembly
Run Code Online (Sandbox Code Playgroud)

出了什么问题?

adr*_*anm 11

您是否在AssemblyInfo.cpp中标记了程序集以进行延迟签名?

[assembly:AssemblyKeyFileAttribute("MyKey.snk")];
[assembly:AssemblyDelaySignAttribute(true)];
Run Code Online (Sandbox Code Playgroud)

  • 见[here](http://stackoverflow.com/questions/158821/managed-c-assembly-attributes) (3认同)

Jus*_*tin 7

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

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

  1. Linker/Advanced/KeyFile属性页面中指定密钥文件
  2. 用于sn.exe将程序集签名为构建后步骤

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


Den*_*nis 6

标记的答案有助于达成最终的解决方案(所以它从我收到一个+1).

然而,不得不花费几个令人沮丧的时间来弄清楚如何AssemblyInfo.cpp在VS2010中创建一个.

以下是该问题的"更多"完整答案.

#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)];
Run Code Online (Sandbox Code Playgroud)

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