You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何防止调用AppDomain.CreateInstanceFromAndUnwrap时主AppDomain加载目标程序集?

避免目标程序集加载到主AppDomain的解决方案

我之前踩过一模一样的坑!你遇到的问题核心原因是:当你调用CreateInstanceFromAndUnwrap时,.NET需要把子域中的对象传递回主域。如果你的TestLib.Class1既没有继承MarshalByRefObject,也不是可序列化类型,.NET就会被迫在主域中加载TestLib.dll,用来反序列化这个对象——这就是为什么主域也出现了该程序集的原因。

针对这个问题,有两种可靠的解决思路:

方案一:让目标类型继承MarshalByRefObject

这是最简单的方案,只要修改TestLib.Class1的定义,让它继承MarshalByRefObject:

namespace TestLib
{
    public class Class1 : MarshalByRefObject
    {
        // 你的类原有逻辑
    }
}

这样当你调用CreateInstanceFromAndUnwrap时,主域拿到的只是一个代理对象,实际的Class1实例完全在子域中运行,主域根本不会加载TestLib.dll。你的原有调用代码不需要改动,直接就能用。

方案二:如果无法修改目标类型,用中介代理在子域内操作

如果你不能修改TestLib的代码,那就要避免把Class1的实例直接传递回主域。可以在主域定义一个中介代理类(必须继承MarshalByRefObject),让这个代理在子域中执行加载和操作TestLib的逻辑:

第一步:定义主域的中介类

// 这个类在主域的程序集中,主域已经加载它了
public class DomainWorker : MarshalByRefObject
{
    public void ExecuteTestLibLogic()
    {
        // 这段代码会在子域中执行,所以TestLib.dll只会加载到子域
        var objHandle = Activator.CreateInstanceFrom(@"TestLib.dll", @"TestLib.Class1");
        var class1Instance = objHandle.Unwrap();
        
        // 在这里调用class1Instance的方法,比如:
        // class1Instance.DoSomething();
    }
}

第二步:在子域创建中介代理并执行逻辑

AppDomainSetup appDomainSetup = new AppDomainSetup();
appDomainSetup.ApplicationName = @"TestDomain";
appDomainSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
AppDomain testDomain = AppDomain.CreateDomain(appDomainSetup.ApplicationName, null, appDomainSetup);

// 创建中介代理,主域拿到的是代理,不会加载TestLib
DomainWorker worker = (DomainWorker)testDomain.CreateInstanceAndUnwrap(
    typeof(DomainWorker).Assembly.FullName,
    typeof(DomainWorker).FullName
);

// 让代理在子域中执行逻辑,TestLib只会在子域加载
worker.ExecuteTestLibLogic();

// 记得用完卸载子域
AppDomain.Unload(testDomain);

为什么testDomain.Load(assemblyBytes)也会加载到主域?

你尝试的testDomain.Load(assemblyBytes)之所以也会让主域加载程序集,是因为Load方法的返回值是Assembly对象——这个对象需要在主域中被表示,.NET会自动在主域加载对应的程序集元数据。所以永远不要把Load返回的Assembly对象拿到主域,所有加载和操作都要放在子域内部完成。


内容的提问来源于stack exchange,提问作者Marcel V.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 10:45:28