.NETで参照の読み込みパスを変更する方法は?
-
03-07-2019 - |
質問
次のような設定が必要です:
+- /ApplicationFolder
-- App.exe
-- Core.dll
-- AnotherShared.dll
+- /PluginsFolder
-- plugin1.dll
-- plugin2.dll
しかし、plugin1.dllはアプリケーションをコンパイルするときにCore.dllとShared.dllを参照するため、" Copy.dll"のコピーをドロップします。および「Shared.dll」プラグインフォルダーも削除しますが、削除しても機能しません。
この問題を解決するにはどうすればよいですか
解決
AppDomainを作成するときに、アセンブリをロードするためのパスを定義できます。 AppDomainSetup.PrivateBinPath
からAppDomain.Createドメインに渡します。
プラグインではAppDomainを使用することをお勧めします(異なるCASとアンロードを許可します)。
VS / msbuildが参照アセンブリを出力ディレクトリにコピーしないようにするには、「ローカルにコピー」を変更します。参照のプロパティでfalseになります。
他のヒント
プラグインプロジェクトが独自のフォルダー(デフォルト)にコンパイルされるようにMEFアプリケーションをセットアップし、ビルド後コマンドを使用して特定のファイルを出力拡張フォルダーにコピーします。
もう1つの方法は、プロジェクトを適切な出力フォルダーに直接ビルドし、他のポスターが言ったように、「プロパティ」を開くことです。プラグインプロジェクトの関連する参照ごとにパネルを作成し、「ローカルにコピー」を設定します。 falseに。
これを試すことができます: MEFでPrivateBinPathを設定するにはどうすればよいですか
または.netがアセンブリを見つけることができないときに発生するAppdomain.AssemblyResolveイベントの処理を試すことができます。そこで、カスタムロジックを実装して、どこからでもアセンブリを見つけてロードできます。
AssemblyResolve eventhandler jsutは、探しているアセンブリまたはnullのいずれかを返します。したがって、AppDomain.GetAssemblies()メソッドから利用可能な既にロードされたCore.dllを返すことができます。
しかし、あなたの場合、単にplugin1.dllにCode.dllを含めなくても構いません。