6

状況は次のとおりです。

  1. 完全なソースをクラスライブラリにリリースしたい
  2. 公開したくないキーファイルを使用して、署名したバイナリもリリースしたい
  3. バッチファイルとビルド前のステップを提供します。これにより、存在しない場合はローカルで新しいキーファイルが作成され、誰でもすぐにソースコードの使用を開始できるようになります。
  4. テストプロジェクトでは、メインプロジェクトの内部クラスを参照する必要があります
  5. 内部クラスにアクセスするには[assembly: InternalsVisibleTo("...")]、メインプロジェクトのAssemblyInfo.csファイルに属性を追加する必要があります
  6. プロジェクト出力に署名しているので、その属性のPublicKey部分を指定する必要があります
  7. これは、公開したくないキーファイルにバインドされます

では、どうすればこれを解決できますか?

テストライブラリではなくメインプロジェクトの出力に署名し、InternalsVisibleTo属性にアセンブリ名のみを指定すると、次のコンパイル時エラーが発生します。

エラー1フレンドアセンブリ参照'Mercurial.Net.Tests'が無効です。厳密な名前で署名されたアセンブリは、InternalsVisibleTo宣言で公開鍵を指定する必要があります。C:\ Dev \ VS.NET \ Mercurial.Net \ Mercurial.Net \ Properties \ AssemblyInfo.cs 22 31 Mercurial.Net

したがって、明らかに、テストプロジェクトの出力に署名しないだけでは十分ではありません。

プロジェクトに署名する設定を削除し、バイナリビルドスクリプトの一部としてプロジェクトファイルを変更する唯一のオプションはありますか?すなわち。<SignAssembly>false</SignAssembly>ビルドする前に、プロジェクトファイルの要素を探して変更しますか?

4

3 に答える 3

2

テストのためだけにリリースするSNKファイルを用意するオプションはありますか?

次に、2つ持ってInternalsVisibleTo、どちらを使用するかを切り替えることができます#if。例:

#if FOR_RELEASE
[InternalsVisibleTo(... your private SNK ...)]
#else
[InternalsVisibleTo(... test SNK which you release ...)]
#endif

FOR_RELEASE次に、公開するビルドをいつ作成するかを設定できます。

于 2010-11-14T20:17:51.197 に答える
1

#ifdefは、気にしない「eval」キーを使用して頭に浮かびます。

于 2010-11-14T20:18:48.947 に答える
1

私が OS プロジェクトで行ったことは単純です。リリース用のプロジェクトをビルドするときにのみ使用するプライベート SNK があります。プロジェクトは、リリース用にコンパイルするときにのみ署名され、通常、プロジェクトは SNK を参照しません。InternalsVisibleToこれにより、SNK がなくても常に機能するため、属性の使用が容易になります。

于 2010-11-14T20:03:35.100 に答える