2017-09-20 11 views
0

あなたのライブラリAで、あなたが使用しないライブラリBへの依存関係を宣言したとします。.Net Core - アセンブリのロード時に依存関係が解決されていますか?

ダイナミックロードを試みて、Bが周囲にない場合は、アプリケーションがクラッシュしますか?あなたが呼び出したメソッドがBのコードに到達しようとしない限り、あなたは明確になっていますか?

+2

ジャストインタイムコンパイラでアセンブリが必要な場合、依存関係はCLRによって解決されます。そうではありません。 "決して使用しない"はしばしば正確に判断されない。しかし、あなたは知るでしょう。 –

答えて

3

これは「使用しない」という意味に依存します。

  1. ライブラリAはライブラリAのコードはライブラリBによって定義されるAPIを使用するが、そのAPIがであるコードパスライブラリB.
  2. によって定義される任意のAPIを使用したことがないコンパイルするために使用されるコード使用されると実行時に呼び出されることはありません。

ケース1の場合、コンパイラはlibraryA.dllを生成するときに未使用の参照をトリミングします。 libraryB.dllは必要なく、ランタイムはそれをロードしようとしません。

ケース2の場合は問題ありませんが、保証はありません。たとえば、libraryBを参照するクラスがあった場合でも、呼び出さないメソッドからの参照であっても、ランタイムは引き続きlibraryB.dllを読み込もうとします。このロードを避けるためにコードを巧みに構造化することもできますが、あなたは火を使って遊んでいます。 libraryBを利用可能にすることが最善です。

+0

私は2番目のケースです...そしてそれは何を計画しているのですか:開発者に、実行時にロードする必要がある依存関係のリストを返すパブリックメソッドを宣言するように強制します。 – Leonardo

+2

ところで、リストを取得できます.dllファイルから参照テーブルを直接読み取ることによって、すべての可能な参照アセンブリの一覧を表示できます。 System.Reflection.Metadataを参照してください。例:https://docs.microsoft.com/en-us/dotnet/api/system.reflection.metadata.metadatareader?view=netcore-2.0 – natemcmaster

+0

あなたは天才です!たくさん! – Leonardo

関連する問題