现在我正在设置 Linker/Advanced/KeyFile 选项。
我收到“mt.exe:一般警告 810100b3:是强名称签名程序集,嵌入清单会使签名无效。您需要重新签署此文件以使其成为有效程序集。” .
从网上阅读,听起来我必须设置延迟签名选项,下载 SDK,并将 sn.exe 作为构建后事件运行。在VS2010中肯定有更简单的方法来做这个常见的操作吗?
现在我正在设置 Linker/Advanced/KeyFile 选项。
我收到“mt.exe:一般警告 810100b3:是强名称签名程序集,嵌入清单会使签名无效。您需要重新签署此文件以使其成为有效程序集。” .
从网上阅读,听起来我必须设置延迟签名选项,下载 SDK,并将 sn.exe 作为构建后事件运行。在VS2010中肯定有更简单的方法来做这个常见的操作吗?
这里有相当多的跛行,这以前从未奏效。它在 VS2010 中得到了“修复”,mt.exe 现在会生成一个警告,而不是让它默默地出错。不是真正的修复,也没有明显的修复,链接器不能只嵌入签名并仍然允许 mt.exe 之后运行。
解决方案是使用构建后事件重新签署程序集。让它看起来像这样:
命令 = sn -Ra "$(TargetPath)" $(ProjectName).snk
如果您还没有密钥文件,则需要自己创建 .snk 文件,从 Visual Studio 命令提示符运行 sn.exe。例如:
cd \whereTheProjectIsLocated
sn.exe -k MyProject.snk
或者从容器中提取它或使用您指定的密钥文件。延迟签名只是使用正确的命令行选项运行 sn.exe 的问题。
如果您不能/不会编辑 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>
Paul Mead 的提议走上了正轨,但这似乎是确定的:http: //blogs.msdn.com/b/vcblog/archive/2011/03/11/10140139.aspx。请注意,更改文本很容易,但忽略将“%”更改为“$”。
我在 WIN32 平台上使用 VS2010 SP1 时遇到了这个问题。查看构建 .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 正确构建并嵌入了公钥。
根据我的经验,最简单的方法是:
1) 打开 Visual Studio 命令提示符 2010 。转到您的项目目录(它是包含源文件的目录)。然后键入sn -k yourKeyName.snk。
2) 在 Visual Studio 2010 中打开您的项目并打开 AssemblyInfo.cpp 文件并添加此行[assembly:AssemblyKeyFileAttribute("yourKeyName.snk")];。
3) 打开项目-> 属性-> 链接器-> 高级。并在“密钥文件”插槽中放入yourKeyName.snk. 同样在“延迟标志”插槽中选择Yes (\DELAYSIGN)。
4)正常构建您的项目。
Phil Atkin 的回复和链接是修复此错误的方法。微软终于开始为 Visual Studio 2010 解决这个问题,但他们从未发布过服务包修复程序。转到此链接以获取 MS 说明和多种修复方法。
http://blogs.msdn.com/b/vcblog/archive/2011/03/11/10140139.aspx
它对我有用。谢谢菲尔。(我会投票给你,但我还是个新手。)
为 Mzedeler 编辑:
这是来自链接的最相关信息,大多数人都可以使用。它跳过了历史和多项目影响。(去链接看看那些东西。)
第一:修复构建过程中的错字:
重新定义用于签署项目的“密钥文件”和“延迟签名”属性:
这些步骤适用于我的项目。有关更多详细信息,请访问 Phil 提供的上述链接。
结束编辑