私は .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;
}
}
何か案は?