アセンブリと依存関係を別の AppDomain にロードする: 再帰的アプローチ
複雑な依存関係を含むアセンブリを新しい AppDomain に読み込むと、課題が生じる可能性があります。 参照されたアセンブリが自動的に読み込まれないため、「ファイルまたはアセンブリ...またはその依存関係の 1 つを読み込めませんでした」などのエラーが頻繁に発生します。 これには、手動の再帰的な読み込みプロセスが必要です。
解決策には次の重要な手順が含まれます:
AppDomain の作成: まず、新しい AppDomain を確立します:
<code class="language-csharp"> AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation; setup.ApplicationBase = dir; AppDomain domain = AppDomain.CreateDomain("SomeAppDomain", null, setup);</code>
メイン アセンブリのロード: AssemblyName
:
<code class="language-csharp"> domain.Load(AssemblyName.GetAssemblyName(path));</code>
再帰参照解決: 新しい AppDomain 内で読み込まれたアセンブリの参照を反復処理します:
<code class="language-csharp"> foreach (AssemblyName refAsmName in Assembly.ReflectionOnlyLoadFrom(path).GetReferencedAssemblies()) { // Utilize a proxy object for cross-AppDomain access Type type = typeof(Proxy); var value = (Proxy)domain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName); // Load the referenced assembly in the target AppDomain value.GetAssembly(refAsmName.FullName); }</code>
クロスドメイン相互作用用のプロキシ クラス: Proxy
クラスは、AppDomain 間の通信を容易にします:
<code class="language-csharp"> class Proxy : MarshalByRefObject { public Assembly GetAssembly(string assemblyPath) { try { return Assembly.LoadFile(assemblyPath); } catch (Exception) { return null; } } }</code>
このメソッドにより、必要なすべての依存関係がターゲット AppDomain に再帰的に読み込まれるようになり、ランタイム エラーが防止され、アセンブリの正常な実行が可能になります。
以上がアセンブリとその依存関係を別の AppDomain に再帰的に読み込む方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。