我现在正在设置链接器/高级/KeyFile选项。
我收到了“mt.exe: 一般警告810100b3:这是一个强名称签名程序集,嵌入清单会使签名无效。你需要重新签署这个文件使它成为有效的程序集。” 的提示信息。
从网上阅读的资料看来,我必须设置延迟签名选项、下载SDK,并在后期构建事件中运行sn.exe。在VS2010中肯定还有更简便的方法来执行这种常见操作,对吗?
我现在正在设置链接器/高级/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。请注意,更改文本很容易,但可能会遗漏将“%”更改为“$”。
sn -k yourKeyName.snk
。[assembly:AssemblyKeyFileAttribute("yourKeyName.snk")];
。yourKeyName.snk
。还在“延迟签名”槽中选择Yes (\DELAYSIGN)
。我在WIN32平台上使用VS2010 SP1时遇到了这个问题。查看构建.log文件后,我发现在.DLL的初始链接中给出了/KEYFILE参数,但在创建清单并进行第二次链接以包含清单后,/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文件已经正确地构建并嵌入了公钥。
Phil Atkin的回复和链接是解决这个Bug的方法。 Microsoft最终解决了Visual Studio 2010中的问题,但他们从未发布过服务包修复程序。 访问此链接以获取MS的解释和多种修复方法。
http://blogs.msdn.com/b/vcblog/archive/2011/03/11/10140139.aspx
这对我有用。谢谢Phil。(我想给你点赞,但我还是个新手。)
为Mzedeler编辑:
这是大多数人可以使用的来自链接中最相关的信息。它跳过了历史和多项目的影响。(转到链接查看那些内容。)
首先:修复构建过程中的拼写错误: