別のアセンブリ (ビルド時には不明) から型を「動的」として読み込み、その型でメソッドを実行しようとしています。私の目標は、「プラグイン」を親アプリケーションから完全に切断して、共有コードや共通のインターフェイス タイプを必要としないようにすることです。インターフェースは、ロードされた型の予期されるメソッド シグネチャによって暗示されます。
これは機能します:
dynamic myObj = Assembly.Load("MyAssembly").CreateInstance("MyType");
myObj.Execute();
ただし、これにより、その型がすべての依存アセンブリと共に現在の AppDomain に読み込まれます。これを変更して、別の AppDomain で同じことを実行できるようにします。
これは機能しますが、dynamic キーワードを使用しません。Execute メソッドを呼び出すには、インスタンス化する明示的な型を知る必要があります。
var appDomain = AppDomain.CreateDomain(domainName, evidence, setup);
var myObj = appDomain.CreateInstanceAndUnwrap(assembly, type);
typeof(IMyInterface).InvokeMember("Execute", BindingFlags.InvokeMethod, null, myObj);
これは本質的に私のターゲットケースであり、次のようなものを機能させようとしています:
dynamic myObj = ad.CreateInstanceAndUnwrap(assembly, type);
myObj.Execute();
「'System.MarshalByRefObject' には 'Execute' の定義が含まれていません」というメッセージが表示された RuntimeBinderException が発生し続けます。このメッセージは理にかなっています。'Execute' の定義が含まれていないことは確かですが、インスタンス化しようとしている型に実際に 'Execute' メソッドが含まれていることはわかっています。これが機能しないようにしている透過プロキシで何かが起こっていると思いますが、何がわからないのですか。
インスタンス化しようとしている実際のクラスは次のようになります。
[Serializable]
public class MyClass : MarshalByRefObject {
public void Execute() {
// do something
}
}
また、共有インターフェイスでこれを試しました(私の主な目標ではありませんが、最初にこれを理解しようとしています)ので、次のようになります。
[Serializable]
public class MyClass : MarshalByRefObject, IPlugin {
public void Execute() {
// do something
}
}
IPlugin は親アプリケーションで既知のタイプであり、プラグインはビルド時に適切な参照を持っていますが、これも機能していないようです。
この時点で、AppDomain の境界を越えて型を動的として読み込むことはできないと推測しています。
これを実際に機能させる方法はありますか?