30

Reflection を使用して Windows.Net アプリケーションにアドオン システムを追加しようとしています。ただし、依存関係のあるアドオンがあると失敗します。

アドオン クラスは、インターフェイス '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();

アドオンが依存関係を使用しない場合にうまく機能します。しかし、アドオンがディスクのアドオンの近くに保存されている別の DLL (C:\Temp\TestAddon\MyTools.dll) を参照して使用すると、失敗します:
System.IO.FileNotFoundException: ファイルまたはアセンブリ 'MyTools.dll を読み込めませんでした' またはその依存関係の 1 つ。

アドオン DLL を実行可能ファイルの近くにコピーしたくありません。.Net ランタイムに "C:\Temp\TestAddon\" で依存関係を検索するように指示するにはどうすればよいですか?

追加することに注意してください

Assembly assembly = Assembly.LoadFile(@"C:\Temp\TestAddon\MyTools.dll");

何も変更しないでください。

4

5 に答える 5

47

MyTools.dllがAddon.dllと同じディレクトリにある場合、コードを機能させるAssembly.LoadFromのではなく、呼び出すだけで済みます。Assembly.LoadFileそれ以外の場合は、AppDomain.AssemblyResolveイベントを処理する方法です。

于 2008-10-08T09:31:14.427 に答える
1

リフレクションを使用して private にアクセスできますAssembly._GetReferencedAssemblies()

メソッドは .NET フレームワークの将来のバージョンで変更される可能性がありますが、その可能性は低いと思われます。ASP.NET はそれに大きく依存していますが、私が知っている唯一のアセンブリmscorlibから移動できる可能性があります。System.Webメソッドが参照される場所。

于 2008-10-08T09:57:45.327 に答える
1

Assembly.LoadFrom は、アドオンで webService を使用しようとするまでうまく機能します。 「型 'X' のオブジェクトを型 'X' にキャストできません」という例外が発生しました。

見苦しいですが、Assembly.LoadFile を AppDomain.AssemblyResolve と共に使用します。

みんなありがとう。

于 2008-10-08T13:39:58.827 に答える
1

いくつかのオプション:

  1. にアタッチしAppDomain.AssemblyResolveて、CLR がアセンブリを解決できるようにすることができます。
  2. アドインを独自に分離することを検討できますAppDomain(System.AddIn名前空間とこの Web サイトを参照してください)。
于 2008-10-08T09:10:02.600 に答える
1

Inversion Of Controlコンテナーの使用を検討しましたか? 私は Castle Windsor を外部の Boo ファイルと共に使用しています。これにより、再コンパイルしたり、依存関係を提供することを心配したりすることなく、アプリケーションを簡単に拡張できます。

于 2008-10-08T09:39:15.690 に答える