gpt4 book ai didi

c# - 卸载包含导致 CannotUnloadAppDomainException 的 POS 硬件的子 AppDomain

转载 作者:太空宇宙 更新时间:2023-11-03 11:07:00 24 4
gpt4 key购买 nike

我使用的是 .net 4.0 和 POS.net 1.12,我在新的子 AppDomain 中创建了一个硬件类,这样任何未处理的异常都不会杀死我的父 AppDomain。

我可以创建子 AppDomain 并毫无问题地调用它。但是,如果我尝试卸载 AppDomain,则会收到异常“CannotUnloadAppDomainException”。

我用谷歌搜索了这个问题,异常通常发生在线程无法被杀死的时候。我实际上并没有在子类中创建任何新线程。

我设法查明导致此错误的代码段。如果我创建 POS 硬件类并且它只创建 POS 对象那么它工作正常。但是,如果我在任何硬件上调用方法“Open()”,则在卸载时会发生此异常。现在,在我尝试卸载之前,我关闭了所有硬件,并确保清除代码被命中,所以我不确定问题是什么。

下面是创建和卸载 AppDomain 的代码:

AppDomain hardwareDomain = AppDomain.CreateDomain("Hardware domain");

IHardwareManager hardwareManager =
(IHardwareManager)hardwareDomain.CreateInstanceFromAndUnwrap(typeof(OposHardwareManager).Assembly.Location,
typeof(OposHardwareManager).FullName);

hardwareManager.StartupHardware();

hardwareManager.CloseDownHardware();
hardwareManager = null;

// **** causes exception
AppDomain.Unload(hardwareDomain);

这是硬件类:

public class OposHardwareManager : MarshalByRefObject, IHardwareManager
{
private PosExplorer _posExplorer;
private PosPrinter _printer;

public void StartupHardware()
{
// create the hardware explorer
this._posExplorer = new PosExplorer();

// create and enable the printer
DeviceInfo printerInfo = this._posExplorer.GetDevice(DeviceType.PosPrinter);
PosDevice printerDevice = this._posExplorer.CreateInstance(printerInfo);
this._printer = (PosPrinter)printerDevice;

// ***** this line here, if run, causes the exception on unload
this._printer.Open();
this._printer.Claim(2000);
this._printer.DeviceEnabled = true;
}

public void CloseDownHardware()
{
this._printer.Release();
this._printer.Close();

this._printer = null;
this._posExplorer = null;
}
}

有什么想法吗?

最佳答案

如果您在创建域中引用一个类型(就像您使用 typeof(OposHardwareManager) 所做的那样),程序集也将加载到该域中。当发生这种情况时,iow 类型“向上”跨越域边界,创建的域将无法卸载。

我建议您不要引用包含 OposHardwareManager 的程序集,而是简单地使用完整限定名称创建它。这可能涉及一些重构。

关于c# - 卸载包含导致 CannotUnloadAppDomainException 的 POS 硬件的子 AppDomain,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15521541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com