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

21

我现在正在设置链接器/高级/KeyFile选项。

我收到了“mt.exe: 一般警告810100b3:这是一个强名称签名程序集,嵌入清单会使签名无效。你需要重新签署这个文件使它成为有效的程序集。” 的提示信息。

从网上阅读的资料看来,我必须设置延迟签名选项、下载SDK,并在后期构建事件中运行sn.exe。在VS2010中肯定还有更简便的方法来执行这种常见操作,对吗?

6个回答

15

这里有些困难,以前从未正常工作过。在VS2010中得到了“修复”,现在mt.exe会生成警告,而不是让它默默地出错。这不是一个真正的解决方法,也没有明显的解决方法,链接器不能仅嵌入签名并且允许mt.exe然后运行。

解决方案是使用后期构建事件重新签名程序集。如下所示:

命令 = sn -Ra "$(TargetPath)" $(ProjectName).snk

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

cd \whereTheProjectIsLocated
sn.exe -k MyProject.snk

或者从容器中提取它,或者使用您指定的密钥文件。 延迟签名只是运行具有适当命令行选项的sn.exe的问题。


不是我想听到的。需要在 $(TargetPath) 周围加上引号。建议: 添加:指定 KeyFile 和 DelaySign 以让 mt.exe 闭嘴。 添加:-q 选项以让 sn.exe 闭嘴。 - jyoung
2
在我的看法中,这在Visual Studio 2008中运行良好 - 清单被嵌入而没有警告,并且生成的程序集仍然被正确签名(sn -v未报告任何错误)。您是否了解有关为什么在VS 2010中发生了更改的更多细节? - Charlie
2
在 MSDN Connect 上投票以修复它:https://connect.microsoft.com/VisualStudio/feedback/details/464524/mt-error-810100b - brickner
Voted++ - 我似乎在2010 SP1中遇到了更多麻烦。Visual Studio似乎忽略密钥文件和延迟签名的链接器选项。为了使其工作,我不得不在Linker->Command Line页面上明确指定完全相同的选项(/KEYFILE:"..\myfile.snk" /DELAYSIGN),然后使用sn -Ra "$(TargetPath)" $(ProjectName).snk的后置生成事件才能使其工作。 - Travis
可以在以下网址找到解释文档:http://msdn.microsoft.com/zh-cn/library/ms235305.aspx - heavyd

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
你让我的一天充满了喜悦!这解决了我们C++/CLI应用程序未被签名的问题。而你的方法彻底解决了团队成员的这个问题(感谢 SVN :) )。 - Kluyg
2
救命稻草。这个解决方案解决了我的问题,现在已经与源代码一起提交了。 - Robin Robinson
同意-这比强制人们在他们的VS2010安装中修改.targets文件要好得多。感谢@user634175! - Per Lundberg

2

1
在我的经验中,最简单的方法是:
1)打开Visual Studio命令提示符2010。转到您的项目目录(它是包含源文件的目录)。然后键入sn -k yourKeyName.snk
2)在Visual Studio 2010中打开您的项目并打开AssemblyInfo.cpp文件,添加此行[assembly:AssemblyKeyFileAttribute("yourKeyName.snk")];
3)打开Project->Properties->Linker->Advanced。在“密钥文件”槽中放置yourKeyName.snk。还在“延迟签名”槽中选择Yes (\DELAYSIGN)
4)像往常一样构建您的项目。

1

我在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文件已经正确地构建并嵌入了公钥。


0

Phil Atkin的回复和链接是解决这个Bug的方法。 Microsoft最终解决了Visual Studio 2010中的问题,但他们从未发布过服务包修复程序。 访问此链接以获取MS的解释和多种修复方法。

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

这对我有用。谢谢Phil。(我想给你点赞,但我还是个新手。)

为Mzedeler编辑:
这是大多数人可以使用的来自链接中最相关的信息。它跳过了历史和多项目的影响。(转到链接查看那些内容。)

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

  1. 在 Windows 7 中:转到开始->所有程序->附件
  2. 右键单击命令提示符图标,从下拉列表中选择“以管理员身份运行”。
  3. 键入:cd %ProgramFiles(x86)%\MSBuild\Microsoft.Cpp\v4.0\Platforms\Win32
  4. 键入:notepad Microsoft.Cpp.Win32.targets
  5. 找到“LinkEmbedManifest”目标(搜索:Target Name="LinkEmbedManifest")
  6. 在上述目标下,在任务“< Link”中执行以下步骤。
  7. 更改属性 DelaySign
    • 从:DelaySign ="%(Link.DelaySign)"
    • 改为:DelaySign ="$(LinkDelaySign)"
    • 确保更改了%为$并删除了Link和Delay之间的句号。)
  8. 更改属性 KeyFile
    • 从:KeyFile ="%(Link.KeyFile)"
    • 改为:KeyFile ="$(LinkKeyFile)"
    • 确保更改了%为$并删除了Link和Key之间的句号。)
  9. 保存更改并退出记事本。
  10. 通过输入 Exit 退出命令窗口
重新定义用于签署项目的“密钥文件”和“延迟签名”属性:
1. 进入MS Visual Studio 2010并打开您的项目。 2. 右键单击您的“项目”以打开属性页面。 3. 转到配置属性->链接器->高级选项。 4. 使用您的原始密钥文件(例如myfile.snk)覆盖“密钥文件”属性。 5. 退出属性页面。 6. 保存并编译您的程序。
这些步骤适用于我的项目。有关更多详细信息,请访问Phil提供的上面的链接。
编辑结束

通常在StackExchange上提供答案链接并不是正确的方式,但我可以看出这个答案相当长。你能不能简化一下并在这里提供呢? - mzedeler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接