AppDomain.Unload 问题

Posted

技术标签:

【中文标题】AppDomain.Unload 问题【英文标题】:AppDomain.Unload issue 【发布时间】:2011-07-06 15:04:30 【问题描述】:

当我调用 AppDomain.Unload(name) 方法时,是否会卸载 appdomain。或者它标记下一次垃圾收集。 我有以下情况 应用程序域的集合。列表应用程序 从 ListApp 卸载特定域说 d1 再次卸载 d1 后立即创建域 d1 并将其添加到 ListApp 当我使用 d1.CreateInstanceAndUnwrap() 方法时,它会抛出异常“尝试访问未加载的应用程序域”

public static IDictionary<object, AppDomain> LoadedDomains  get; internal set; 

private static void Load(object key)

    if (!LoadedDomains.Contains(key))
    
        AppDomain domain = AppDomain.CreateDomain("t");
        LoadedDomains.Add(key, domain);
    


private static void UnLoad(object key)

    if (LoadedDomains.Contains(key))
    
        AppDomain.Unload(LoadedDomains(key));
        LoadedDomains.Remove(key);
    


private static void Execute()

    object key = new object();
    Load(key);
    Unload(key);
    Load(key);
    MyObject myobj= LoadedDomains[key].CreateInstance("asName", "type");

【问题讨论】:

当您调用 .Unload 时它会卸载,但我们必须查看您的代码才能找出引发异常的原因。 与您的 AppDomain 问题无关,但您的字典被声明为具有 string 键,但您在方法中使用 object 作为键。 修复你的代码以便编译后,它似乎对我有用。 @Mike Two 对不起,这是我的错。 【参考方案1】:

听起来您描述的是多线程问题,而不是垃圾收集问题 - 因为您的代码在卸载域后尝试访问域,但在创建新域并将其分配给多变的。

Unload 同步卸载有问题的 AppDomain,如果无法卸载该域,则会抛出异常。

需要更多代码来进一步协助...

【讨论】:

【参考方案2】:

我在我的代码中发现了问题。 卸载域而不刷新字典。

【讨论】:

以上是关于AppDomain.Unload 问题的主要内容,如果未能解决你的问题,请参考以下文章

AppDomain.Unload 抛出终结器?

.NET AppDomain.Unload 触发失控线程

进程和 AppDomain 加载/卸载

即使我卸载 appdomain,我的 dll 也不会卸载

assembly 需要 unload 和 update 的时候怎么办?

C# 动态加载/卸载程序集