Reflection.Net:依存関係を読み込む方法は?
-
05-07-2019 - |
質問
Reflectionを使用してWindows.Netアプリケーションにアドオンシステムを追加しようとしています。しかし、dependencieのアドオンがあると失敗します。
アドオンクラスは、インターフェイス 'IAddon'を実装し、空のコンストラクターを持つ必要があります。
メインプログラムはReflectionを使用してアドオンをロードします。
Assembly assembly = Assembly.LoadFile(@"C:\Temp\TestAddon\Addon.dll");
Type t = assembly.GetType("Test.MyAddon");
ConstructorInfo ctor = t.GetConstructor(new Type[] { });
IAddon addon= (IAddon) ctor.Invoke(new object[] { });
addon.StartAddon();
addonがdependencieを使用しない場合、非常に効果的です。
しかし、アドオンの参照で、ディスク内のアドオンの近くに保存されている別のDLL(C:\ Temp \ TestAddon \ MyTools.dll)を使用すると、失敗します:
System.IO.FileNotFoundException:ファイルまたはアセンブリ「MyTools.dll」またはその依存関係の1つをロードできませんでした。
アドオンDLLを実行可能ファイルの近くにコピーしたくないのですが、" C:\ Temp \ TestAddon \"で検索するように.Netランタイムに指示するにはどうすればよいですか?依存関係についてはどうですか?
追加
Assembly assembly = Assembly.LoadFile(@"C:\Temp\TestAddon\MyTools.dll");
何も変更しないでください。
解決
MyTools.dll が Addon.dll と同じディレクトリにある場合は、代わりに Assembly.LoadFrom
を呼び出すだけです。 Assembly.LoadFile
を使用して、コードを機能させます。それ以外の場合は、 AppDomain.AssemblyResolve
イベントを処理する方法があります。
他のヒント
Inversion Of Control コンテナの使用を検討しましたか? Castle Windsorと外部Booファイルを使用して、依存関係を再コンパイルしたり心配することなく、アプリケーションを簡単に拡張できます
リフレクションを使用して、プライベートな アセンブリにアクセスできます。
_GetReferencedAssemblies()
。
.NETフレームワークの将来のバージョンではメソッドが変更される可能性がありますが、ASP.NETは大きく依存しているようには見えませんが、移動することは可能です mscorlib
から System.Web
へ。これは、メソッドが参照されている場所から知っている唯一のアセンブリです。
Assembly.LoadFromは、アドオンでwebServiceを使用するまでうまく機能しますが、" タイプ 'X'のオブジェクトをタイプ 'X'にキャストできません"がありました。例外。
見苦しいが、AppDomain.AssemblyResolveでAssembly.LoadFileを使用する。
みんなありがとう。
オプションのカップル:
-
AppDomain.AssemblyResolve
に添付して、CLRがアセンブリを解決できるようにします。 - アドインを独自の
AppDomain
に分離する方法を検討できます(System.AddIn
名前空間とこのウェブサイト)。