6

当店では、Cruise ControlとMSBuildを使用して、継続的インテグレーションの一環として製品のビルドを自動化しています。

ビルドの一部は、アセンブリに署名して、強い名前を付けることです。

ローカルで開発する場合のプロジェクトファイルでは、署名が指定されていません。これは、MSBuildスクリプトによってオーバーライドされるためです。

InternalsVisibleTo属性を使用する必要がある単体テストを導入することを決定するまで、これはすべて問題ありません。また、この手法を使用する単体テストを備えた優れたオープンソースライブラリの使用も開始しました。

これは、私のマシンではAssemblyInfo.cs、次のステートメントを使用するように更新できることを意味します。

[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests")]

そして、すべてが順調です。

ただし、ビルドマシンがアセンブリに署名するため、これをチェックインするとビルドが中断されます。代わりに、その行を次のように更新する必要があります。

[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests, 
             PublicKey="magic key here..)"]

私は、議会に署名せず、それを1日と呼ぶことに半信半疑です。ただし、「アセンブリに署名することはベストプラクティスです」(このマントラを3回繰り返す)。これを行うことで利益が得られる場合は、リモートにしたくありません。

GACにはインストールしません。改ざんについては特に心配していません。ライブラリを使用するサードパーティについて心配する必要はありません。アプリを更新するときに、すべてのファイルを一度に更新します。最も識別可能な利点は、サポートの誰かがアセンブリのランダムなバージョンをランタイムフォルダにコピーできず、しばらくの間動作しているように見えることです。

署名を有効にするために約100個のプロジェクトファイルを手動で変更して、関連する作業の缶を開けたくありません。また、内部にあるべきものをパブリックとしてマークすることによって物事をハックしたくない、バインディングリダイレクトに入りたくない、そして単体テストを削除したくない。

強い名前を持たないことの簡単さと、強い名前を持つことのすべての利点(ある場合)が欲しいのですが、それを行うために多くの余分な作業を作成したくありません。質問するのは多すぎますか?

この投稿では、問題と解決策について詳しく説明していますが、私はそれを利用するMSBuildスクリプトの専門家ではありません。

http://social.msdn.microsoft.com/forums/en-US/msbuild/thread/02df643c-956a-48bd-ac01-4a1016d91032/

この問題の適切な解決策は何ですか?

任意の入力と議論のポイントは大歓迎です。

4

2 に答える 2

5

開発者ビルドへの署名を無効にしてコンパイラ シンボルを定義するために使用するのと同じ構造を使用します。DO_NOT_SIGN の場合は、 で次のようAssemblyInfo.csに使用します。

#if DO_NOT_SIGN
[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests")]
#else
[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests, PublicKey="magic key here..)"]
#endif

私の個人的な意見では、ビルド スクリプトからソース コードを変更するよりも洗練されています。

于 2011-06-25T13:41:13.873 に答える
4

コンパイルする前に、主要な情報をソース ファイルにパッチすることができます。

次の例ではFileUpdateMSBuild コミュニティ タスクの と (非常に粗雑な) 正規表現を使用して、重要な情報を C# AssemblyInfo.cs ファイルにパッチします。

<ItemGroup>
    <AssemblyInfoFiles Include="$(MSBuildProjectDirectory)**/AssemblyInfo.cs"/>
</ItemGroup>
<FileUpdate
  Files="@(AssemblyInfoFiles)"
  Regex='(\[assembly:\s*InternalsVisibleTo\(\"[\w.]*\")(\)\])'
  ReplacementText='$1, PublicKey="$(StrongNamingPublicKey)"$2' />

ただし、プロジェクトを常に厳密な名前の記号に変更することは、開発環境と展開環境の間のもう 1 つの違いを排除するためのよりクリーンなソリューションであり、簡単にスクリプト化できると思います。

于 2011-06-25T10:51:41.253 に答える