1. ホーム
  2. c#

[解決済み] アセンブリの読み込み、クラスの検索、Run()メソッドの呼び出しの正しい方法

2023-07-06 19:37:06

質問

コンソールプログラムの例です。

class Program
{
    static void Main(string[] args)
    {
        // ... code to build dll ... not written yet ...
        Assembly assembly = Assembly.LoadFile(@"C:\dyn.dll");
        // don't know what or how to cast here
        // looking for a better way to do next 3 lines
        IRunnable r = assembly.CreateInstance("TestRunner");
        if (r == null) throw new Exception("broke");
        r.Run();

    }
}

アセンブリ(.dll)を動的に構築し、アセンブリをロードし、クラスをインスタンス化し、そのクラスのRun()メソッドを呼び出したいと思っています。TestRunner クラスを何かにキャストしてみるべきでしょうか。あるアセンブリ(動的コード)の型が、私の(静的アセンブリ/シェルアプリ)の型についてどのように知っているのかよくわかりません。数行のリフレクションコードを使用して、単にオブジェクト上でRun()を呼び出す方が良いですか?そのコードはどのように見えるべきでしょうか?

UPDATE William Edmondson - コメント参照

どのように解決するのですか?

AppDomainを使用する

アセンブリを独自の AppDomain を最初に指定します。

なので、代わりに の代わりに、先に述べた :

var asm = Assembly.LoadFile(@"C:\myDll.dll");
var type = asm.GetType("TestRunner");
var runnable = Activator.CreateInstance(type) as IRunnable;
if (runnable == null) throw new Exception("broke");
runnable.Run();

私は次のように提案します。 関連する質問に対するこの回答 ):

var domain = AppDomain.CreateDomain("NewDomainName");
var t = typeof(TypeIWantToLoad);
var runnable = domain.CreateInstanceFromAndUnwrap(@"C:\myDll.dll", t.Name) as IRunnable;
if (runnable == null) throw new Exception("broke");
runnable.Run();

これで、アセンブリをアンロードして、異なるセキュリティ設定をすることができます。

アセンブリの動的なロードとアンロードのためにさらに柔軟性とパワーを求めるなら、Managed Add-ins Framework (すなわち、アセンブリのロードとアンロードのための System.AddIn 名前空間) を見てください。詳細については、以下の記事を参照してください。 アドインと拡張性 (MSDN) .