我正在使用 .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;
}
}
有任何想法吗?