2017-08-26 10 views
-1

他の部分が私のインターフェイスライブラリを参照し、私たちのツール用に自己コンパイルされたMEFプラグインをデプロイする協力プロジェクトに遭遇しました。私はそのメソッドがどのメソッドを使用しているのか知っています。メソッドのシグネチャが変更されていれば、ビルドプロセス中にライブラリを監視したいと思っています(別のインタフェースバージョンにつながるプラグインロード可能性)。c#ビルド中にクリティカルメソッドのシグネチャの変更を監視する

実際には、シグネチャが何らかの形でハードコードされ、リフレクションによってチェックされるコンソールプロジェクトがありますが、もっとエレガントでシンプルな方法があります。

ヒントがあればいいです。

ありがとうございます!

答えて

0

Roslyn 2.3は、generating reference assembliesの機能を導入しています。これはパブリックタイプとメンバのみを含むアセンブリです。 "deterministic" feature(=>再現可能なビルド)と一緒に使用すると、生成されたリファレンスアセンブリは、パブリックインターフェイスに変更が加えられていない限り、バイナリで同じままです(実装の変更とプライベート/内部のメンバーは関係ありません)。 VS 2017 15.5が出てくる

<PropertyGroup> 
    <Deterministic>true</Deterministic> 
    <ProduceReferenceAssembly>true</ProduceReferenceAssembly> 
</PropertyGroup> 

までは、私が(例えば、「定義に行く」)IDEがあるため、すべてのかかるプロジェクトに<CompileUsingReferenceAssemblies>false</CompileUsingReferenceAssemblies>を追加することをお勧めしていくつかの問題があります。

つまり、あなたのcsprojにこれを追加することができます.NET Coreおよび.NET Standardプロジェクトで使用されている「新しいプロジェクトシステム」を使用していない限り、この機能は使用できません。 (プロジェクトを参照するプロジェクトは、パブリックインターフェイスが変更された場合にのみ再構築されるという考えがあります。これにより、実装が変更された場合に大きなソリューションのインクリメンタルビルドがスピードアップされます)。

これらの変更により、出力にrefフォルダが作成されます。次に、そこにあるassmblyのチェックサムが、各ビルド上の既知のCheksumと一致するかどうかを確認できます。

+0

ああたかったのです。残念ながら、何百ものタイプのinterfaces.dllがあります。確定的なrefアセンブリオプションは、他のインタフェースを追加するたびに新しいチェックサムを持つ新しいアセンブリを再現しますか? – Monga

+0

はい、それは本当です。その場合、このオプションはあなたのためには機能しません。それが誰かを助ける場合に備えて、私は答えを残しておきます –

0

最後にリリースされたインターフェイスライブラリでコンパイルされたプロジェクトパートナーと同じインターフェイスDLLと同じオブジェクトを使用して、try catchブロックで小さなコンソールアプリケーションを作成しました。実行中、シグネチャが無効(通常の.NETプロセスによって検出された)した場合はキャッチブランチに入り、終了コードは-1で上がります。

これをすべてポストビルドプロセスで行い、終了コードをthis articleとして陰気化し、自動的にビルドを解除します。

ないそのソリューションに非常に満足し、それが働いてしまった...さらにアイデアはまだ大丈夫、それは全体の組み立てのための興味深いアプローチである、:-)

関連する問題