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

最終的に、コンパイル直後に WinMD ファイルに署名するように、MSBuild ターゲットを一緒にハックして作成しました。

<?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 に答える