web-dev-qa-db-ja.com

DLLを別のAppDomainにロードする

1つ以上のDLLを動的にロードして、メインアプリケーションとは異なるセキュリティまたはベースパスで実行できるようにしたい。これらのDLLを別のAppDomainにロードして、そこからオブジェクトをインスタンス化するにはどうすればよいですか?

32
Jon Turner

すなわち

AppDomain domain = AppDomain.CreateDomain("New domain name");
//Do other things to the domain like set the security policy

string pathToDll = @"C:\myDll.dll"; //Full path to dll you want to load
Type t = typeof(TypeIWantToLoad);
TypeIWantToLoad myObject = (TypeIWantToLoad)domain.CreateInstanceFromAndUnwrap(pathToDll, t.FullName);

すべてが正常に行われた場合(例外はスローされません)、TypeIWantToLoadのインスタンスが新しいドメインに読み込まれます。持っているインスタンスは実際にはプロキシです(実際のオブジェクトは新しいドメインにあるため)が、通常のオブジェクトと同じように使用できます。

注:私の知る限り、TypeIWantToLoadはMarshalByRefObjectから継承する必要があります。

34
Jon Turner

3.5をターゲットにしている場合は、新しい managed extensibility framework を利用して、煩わしい作業をすべて処理できます。

4
Will

AppDomain.CreateInstance メソッドを使用してこれを行うことができます。実際のオブジェクトを取得するには、返されるObjectHandleのUnwrapメソッドを呼び出す必要があります。

2
Andy

前述のように、AppDomain.CreateDomainを使用して新しいアプリドメインを作成します。次に、Loadメソッドを使用してアセンブリをロードするか、ExecuteAssemblyメソッドを使用してアセンブリを実行することもできます。 GetAssembliesを使用して、アセンブリが既に読み込まれているかどうかを確認できます。一度読み込まれたアセンブリは、アンロードできないことに注意してください。ドメインをアンロードする必要があります。

0
Ty.

AppDomain.Create(...)で新しいAppdomainを作成します。 AppDomainを作成した後、DLLをそのAppDomainにロードします。

Appdomainが作成するすべてのメソッドを調べます*。 CreateInstanceAndUnwrapなどの特定のものがあります。

0
Min