質問

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

役に立ちましたか?

解決

すなわち

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 から継承する必要があります。

他のヒント

3.5 をターゲットにしている場合は、新しい機能を利用できます。 マネージド拡張性フレームワーク すべての面倒な作業をあなたに代わって処理します。

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

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

Appdomain が持つ Create* メソッドをすべて調べてください。CreateInstanceAndUnwrap などの特定のものがあります。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top