32

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

4

5 に答える 5

35

すなわち

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

于 2008-09-18T14:29:27.043 に答える
4

3.5 をターゲットにしている場合は、新しい管理された拡張性フレームワーク を利用して、面倒な作業をすべて処理できます。

于 2008-09-17T23:50:12.213 に答える
2

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

于 2008-09-17T23:46:48.007 に答える
0

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

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

于 2008-09-17T23:50:47.890 に答える
0

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

于 2008-09-18T00:27:05.727 に答える