8

私のアプリケーションは、実行パスにあるすべてのライブラリアセンブリをロードし、含まれているクラスに対して既知のメソッドを実行します。

アプリケーションアセンブリを参照するアセンブリでも同じことを行う必要があります。これは可能ですか?私が知っておくべきマイナスの影響はありますか?

マスターアセンブリ:

public abstract class TaskBase 
{ 
    public abstract void DoWork(); 
}  

LoadAssemblyFromFile("Assembly0001.dll");  
Assembly0001.Task1.DoWork();  

子アセンブリ:

public sealed class Task1: MasterAssembly.TaskBase  
{ 
    public override void DoWork { /* whatever */ } 
}
4

4 に答える 4

6

はい、これは可能です。マスターアセンブリが子アセンブリを参照していない限り、問題はありません。そうしないと、循環依存関係になります。

マスターアセンブリは、子アセンブリをロードするだけで、インターフェイスを実装することを除いて、子アセンブリについて何も知りません。そうすれば、マスターアセンブリは子アセンブリを参照する必要がありません。

私の知る限り、落とし穴はありません。この手法は、特定のシナリオで正常に使用されます。

于 2012-04-15T20:30:32.980 に答える
1

私の経験では、これには何の問題もありません。実際、MEFAssemblyCatalogは、 (実装がマスターアセンブリDirectoryCatalogにある場合)および(インターフェイスの実装が特定のディレクトリ内のアセンブリにある場合 )の形式でこの手法を使用します。

どちらもAggregateCatalog問題なく一緒に使用できます。

于 2012-04-15T20:27:47.000 に答える
0

LoadAssemblyFromFile( "...")メソッドのコードを投稿しませんでしたが、Assembly.LoadFrom()またはAssembly.LoadFile()を使用してアセンブリを読み込むと、InvalidCastException、MissingMethodException、またはその他の例外が発生する可能性があります。特に、アプリケーションの場合はそうです。ロードされたアセンブリは両方とも同一の他のアセンブリを参照します。LoadFrom()およびLoadFile()は、アプリケーションが存在するものとは異なるバインディングコンテキストでアセンブリをロードします。詳細な説明については、これを参照してください。

于 2012-04-15T22:10:23.050 に答える
0

唯一の「問題」は、マスターアセンブリにAssembly0001.Task1を記述できないことですが、ロードされたアセンブリで正しいタスクを見つけて、それを呼び出すことができます。

var asm = LoadAssemblyFromFile("Assembly0001.dll");
var taskType = asm.GetTypes().FirstOrDefault(t => typeof(TaskBase).IsAssignableFrom(t));
var task = (TaskBase)Activator.CreateInstance(taskType);
task.DoWork();

あなたはまだいくつかの追加の安全チェックを追加する必要があります:)

于 2012-04-15T20:35:46.210 に答える