1

我们正在交付一个签名的 Windows 运行时组件。目前我们像这样签署winmd:

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe -R MyComponent.winmd mykeypair.snk

这在最坏的情况下需要一个硬编码的路径(假设您使用 64 位构建并且完全具有 v8.0A).. 或者最多需要设置一个环境变量才能进行构建

在 Visual Studio 中,Windows 运行时组件的项目页面上还有一个名为“签名”的部分。如果我检查签名框并选择适当的密钥文件,它似乎可以正常工作,但不会正确签名:

sn -vf MyComponent.winmd

Microsoft (R) .NET Framework Strong Name Utility  Version 4.0.30319.17929
Copyright (c) Microsoft Corporation.  All rights reserved.

MyComponent.winmd is a delay-signed or test-signed assembly

我发现了一些对这个问题的引用,但从未见过实际的错误报告或承认这是一个实际问题。

我们想要发布签名组件而不是未签名组件的原因是我们希望我们的组件能够被其他强命名组件使用。如果我们的组件没有签名,这是不可能的。

这个问题有更好的解决方法,还是我做错了什么导致签名无法按预期工作?

4

1 回答 1

0

我最终编写了一个 MSBuild 目标来将其组合在一起,以便它在编译后对 WinMD 文件进行签名。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="SignWinMD" AfterTargets="ExportWindowsMDFile" Condition="'$(Configuration)' == 'Release'">
    <Exec Command="&quot;$(SDK40ToolsPath)\sn.exe&quot; -R &quot;$(_IntermediateWindowsMetadataPath)&quot; $(AssemblyOriginatorKeyFile)" />
  </Target>
</Project>

</project>您只需在标签之前的某处添加它即可将其包含在您的项目中

<Import Project="SignWinMD.targets" />

完成此操作后,Signing在 Visual Studio 中使用组件的“项目”页面中的菜单时,您的项目将被正确签名。请注意,您必须有一个密钥设置才能工作。

于 2013-06-26T22:07:15.580 回答