在 AppDomain 中加载具有递归引用的程序集
将程序集加载到单独的应用程序域 (AppDomain) 时,还需要手动加载其引用。否则,由于缺少依赖项,可能会导致 FileNotFoundException 错误。
为了递归加载程序集及其所有引用,建议:
<code class="language-C#">// 在当前 AppDomain 中创建一个代理类。 class Proxy : MarshalByRefObject { public Assembly GetAssembly(string assemblyPath) => Assembly.LoadFile(assemblyPath); } // 创建一个新的 AppDomain。 AppDomain domain = AppDomain.CreateDomain("MyDomain", null, domaininfo); // 在新的 AppDomain 中创建一个代理实例。 var value = (Proxy)domain.CreateInstanceAndUnwrap( typeof(Proxy).Assembly.FullName, typeof(Proxy).FullName); // 使用代理将程序集加载到新的 AppDomain 中。 var assembly = value.GetAssembly(assemblyPath); // 迭代程序集的引用并递归加载它们。 foreach (AssemblyName refAsmName in assembly.GetReferencedAssemblies()) { LoadAssemblyWithReferences(refAsmName, domain); }</code>
使用 LoadFrom() 与 LoadFile() 加载程序集
使用 LoadFrom() 加载程序集将尝试在 GAC 或当前 AppDomain 的 bin 文件夹中查找程序集。如果程序集不在这两个位置中的任何一个位置,则此操作可能会失败。
相反,LoadFile() 从特定文件路径加载程序集。此方法要求您手动加载所有依赖项。但是,它可以更好地控制程序集加载过程。
按照上述步骤,可以将程序集及其所有引用递归加载到单独的 AppDomain 中,从而实现更隔离和受控的执行环境。
以上是如何将程序集及其引用递归加载到单独的 AppDomain 中?的详细内容。更多信息请关注PHP中文网其他相关文章!