将程序集和依赖项加载到单独的 AppDomain 中:递归方法
将具有复杂依赖关系的程序集加载到新的 AppDomain 中可能会带来挑战。 诸如“无法加载文件或程序集...或其依赖项之一”之类的错误经常发生,因为引用的程序集不会自动加载。 这需要手动、递归加载过程。
解决方案涉及以下关键步骤:
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中文网其他相关文章!