21

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

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

从网上阅读,听起来我必须设置延迟签名选项,下载 SDK,并将 sn.exe 作为构建后事件运行。在VS2010中肯定有更简单的方法来做这个常见的操作吗?

4

6 回答 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 的问题。

于 2010-04-17T00:41:36.943 回答
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>
于 2012-02-22T15:50:43.110 回答
2

Paul Mead 的提议走上了正轨,但这似乎是确定的:http: //blogs.msdn.com/b/vcblog/archive/2011/03/11/10140139.aspx。请注意,更改文本很容易,但忽略将“%”更改为“$”。

于 2012-01-17T14:36:48.327 回答
1

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

于 2011-10-28T00:18:49.903 回答
1

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

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

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

3) 打开项目-> 属性-> 链接器-> 高级。并在“密钥文件”插槽中放入yourKeyName.snk. 同样在“延迟标志”插槽中选择Yes (\DELAYSIGN)

4)正常构建您的项目。

于 2015-02-13T17:32:51.580 回答
0

Phil Atkin 的回复和链接是修复此错误的方法。微软终于开始为 Visual Studio 2010 解决这个问题,但他们从未发布过服务包修复程序。转到此链接以获取 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. 输入:记事本 Microsoft.Cpp.Win32.targets
  5. 找到“LinkEmbedManifest”目标(搜索:Target Name="LinkEmbedManifest")
  6. 在上述目标下和任务中“< 链接”执行以下步骤。
  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 提供的上述链接。

结束编辑

于 2014-04-17T15:39:26.327 回答