首页 >后端开发 >C++ >如何将程序集及其引用递归加载到单独的 AppDomain 中?

如何将程序集及其引用递归加载到单独的 AppDomain 中?

Linda Hamilton
Linda Hamilton原创
2025-01-15 12:16:48641浏览

How to Recursively Load Assemblies and Their References into a Separate AppDomain?

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn