在VS 2010中有一种简单的方法来签署C ++ CLI程序集吗?

时间:2010-04-16 22:23:20

标签: .net visual-studio-2010 c++-cli assembly-signing

现在我正在设置Linker / Advanced / KeyFile选项。

我收到“mt.exe:一般警告810100b3:是一个强名称签名的程序集,嵌入清单会使签名无效。您需要重新签名此文件才能使其成为有效的程序集。 “

从网上阅读,听起来我必须设置延迟签名选项,下载SDK,并将sn.exe作为post build事件运行。当然在VS2010中必须有一种更简单的方法来执行这种常见操作吗?

6 个答案:

答案 0 :(得分:15)

这里有相当多的跛足,这在以前从未奏效过。它已经在VS2010中“修复”了,mt.exe现在会生成一个警告,而不是让它无声地出错。不是真正的解决方案,并且没有明显的解决方案,链接器不能只嵌入签名并且仍然允许mt.exe在之后运行。

解决方案是使用post-build事件重新签名程序集。看起来像这样:

  

Command = sn -Ra“$(TargetPath)”   $(项目名).SNK

如果您还没有密钥文件,则需要自己创建.snk文件,从Visual Studio命令提示符运行sn.exe。例如:

cd \whereTheProjectIsLocated
sn.exe -k MyProject.snk

或者从容器中提取它或使用指定的密钥文件。延迟签名只是使用正确的命令行选项运行sn.exe。

答案 1 :(得分:14)

如果您不能/不会编辑Microsoft.Cpp.Win32.targets,则将以下内容添加到项目文件中也可以:

<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <!-- snip -->
    <ItemDefinitionGroup>
      <Link>
        <KeyFile>$(LinkKeyFile)</KeyFile>
      </Link>
    </ItemDefinitionGroup>
</Project>

答案 2 :(得分:2)

保罗米德的建议是正确的,但这似乎是确定的:http://blogs.msdn.com/b/vcblog/archive/2011/03/11/10140139.aspx。请注意,更改文本很容易,但省略将“%”更改为“$”。

答案 3 :(得分:1)

我在VS32平台的VS2010 SP1中遇到了这个问题。查看build .log文件,我发现/ KEYFILE参数被赋予了.DLL的初始链接,但是在创建清单并完成第二个链接以包含清单后,缺少/ KEYFILE参数。看了一下后,我发现问题出在C:\ Program Files(x86)\ MSBuild \ Microsoft.Cpp \ v4.0 \ Platforms \ Win32中的Microsoft.Cpp.Win32.targets文件中。第二个链接的KeyFile属性存在拼写错误。我通过改变第441行来修复它:

    KeyFile                        ="%(Link.KeyFile)"

    KeyFile                        ="$(LinkKeyFile)"

通过该更改,第二个链接器传递包含/ KeyFile限定符,而.DLL是使用嵌入的publickey正确构建的。

答案 4 :(得分:1)

根据我的经验,最简单的方法是:

1)打开Visual Studio命令提示符2010。转到项目目录(它是包含源文件的目录)。然后输入sn -k yourKeyName.snk

2)在visual studio 2010中打开您的项目并打开AssemblyInfo.cpp文件并添加此行[assembly:AssemblyKeyFileAttribute("yourKeyName.snk")];

3)打开Project-&gt; Properties-&gt; Linker-&gt; Advanced。并在“密钥文件”插槽中放置yourKeyName.snk。同样在“延迟信号”插槽中选择Yes (\DELAYSIGN)

4)正常构建项目。

答案 5 :(得分:0)

Phil Atkin的回复和链接是修复此错误的方法。 微软终于开始为Visual Studio 2010解决它,但他们从未发布过Service Pack修复程序。 转到此链接以获取MS说明和多种修复方法。

http://blogs.msdn.com/b/vcblog/archive/2011/03/11/10140139.aspx

它对我有用。谢谢菲尔。 (我会投票给你,但我还是个新手。)

编辑Mzedeler:
以下是大多数人可以使用的链接中最相关的信息。它超越了历史和多项目的影响。 (转到链接查看该内容。)

首先:修复构建过程中的拼写错误:

  1. 在Windows 7中:转到“开始” - >“所有程序” - >“附件”
  2. 右键单击“命令提示符”图标,然后从下拉列表中选择“以管理员身份运行”。
  3. 输入:cd%ProgramFiles(x86)%\ MSBuild \ Microsoft.Cpp \ v4.0 \ Platforms \ Win32
  4. 输入:notepad Microsoft.Cpp.Win32.targets
  5. 找到“LinkEmbedManifest”目标(搜索:目标名称=“LinkEmbedManifest”)
  6. 在上述目标和任务“&lt;链接“执行以下步骤。
  7. 更改属性DelaySign
    • 来自:DelaySign =“%(Link.DelaySign)”
    • 收件人:DelaySign =“$(LinkDelaySign)”
    • 确认您已将%更改为$ AND并删除了链接和延迟之间的时间段。)
  8. 更改属性KeyFile
    • 发件人:KeyFile =“%(Link.KeyFile)”
    • To:KeyFile =“$(LinkKeyFile)”
    • 确认您已将%更改为$ AND并删除了Link和Key之间的时间段。)
  9. 保存更改并退出记事本。
  10. 输入以下命令退出命令窗口:退出
  11. 重新定义用于签署项目的“密钥文件”和“延迟签名”属性:

    1. 进入MS Visual Studio 2010并打开您的项目。
    2. 右键点击“项目”以打开属性页面。
    3. 转到配置属性 - >链接器 - >高级
    4. 使用原始密钥文件覆盖属性“密钥文件”。 (例如myfile.snk)
    5. 退出属性页面。
    6. 保存并编译您的程序。
    7. 这些步骤适用于我的项目。有关更多详细信息,请转到Phil提供的上述链接。

      结束编辑