スタンドアロン AppDomain にアセンブリとその参照を再帰的に読み込みます
新しい AppDomain にアセンブリを読み込むときは、FileNotFoundException
エラーを防ぐために、そのすべての参照を必ず再帰的に読み込んでください。この記事では、この複雑なタスクを実行する手順について説明します。
まず、カスタム ApplicationBase
を使用してスタンドアロン AppDomain を作成します。次に、AssemblyName.GetAssemblyName
を使用してルート アセンブリを読み込みます。ただし、これだけでは十分ではなく、アセンブリの参照を手動でロードする必要があります。
これを行うには、ReflectionOnlyLoadFrom
を使用して、実際にロードせずに参照アセンブリのリストを取得します。各参照について、domain.Load(refAsmName)
を使用して AppDomain に読み込みます。
ただし、ここで注意点があります。外部アプリケーション ドメインでプロキシ オブジェクトを実行するには、CreateInstanceAndUnwrap
を呼び出す必要があります。このメソッドにより、オブジェクトがターゲット AppDomain で確実に実行されます。
このプロセスを示すコード例:
<code class="language-csharp">class Program { static void Main(string[] args) { AppDomainSetup domaininfo = new AppDomainSetup(); domaininfo.ApplicationBase = System.Environment.CurrentDirectory; Evidence adevidence = AppDomain.CurrentDomain.Evidence; AppDomain domain = AppDomain.CreateDomain("MyDomain", adevidence, domaininfo); Type type = typeof(Proxy); var value = (Proxy)domain.CreateInstanceAndUnwrap( type.Assembly.FullName, type.FullName); var assembly = value.GetAssembly(args[0]); // AppDomain.Unload(domain); } } public class Proxy : MarshalByRefObject { public Assembly GetAssembly(string assemblyPath) { try { return Assembly.LoadFile(assemblyPath); } catch (Exception) { return null; // throw new InvalidOperationException(ex); } } }</code>
LoadFile
の代わりに LoadFrom
を使用する場合は、FileNotFound
例外を避けるために依存関係を自分でロードする必要があることに注意してください。
以上がアセンブリ参照を別の AppDomain に再帰的に読み込む方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。