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

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

Barbara Streisand
Barbara Streisand原创
2025-01-15 11:51:45856浏览

How to Recursively Load Assembly References into a Separate AppDomain?

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

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