POS for .Net で次のヘルパー クラスを使用して、別の AppDomain 内のハードウェアへの参照を取得します (必要ないくつかの制限を回避します)。<NetFx40_LegacySecurityPolicy enabled="true"/>
public static class PosHelper
{
private static AppDomain _posAppDomain { get; set; }
private static AppDomain PosAppDomain
{
get
{
if (_posAppDomain == null)
{
AppDomainSetup currentAppDomainSetup = AppDomain.CurrentDomain.SetupInformation;
AppDomainSetup newAppDomainSetup = new AppDomainSetup()
{
ApplicationBase = currentAppDomainSetup.ApplicationBase,
LoaderOptimization = currentAppDomainSetup.LoaderOptimization,
ConfigurationFile = currentAppDomainSetup.ConfigurationFile
};
newAppDomainSetup.SetCompatibilitySwitches(new[] { "NetFx40_LegacySecurityPolicy" });
_posAppDomain = AppDomain.CreateDomain("POS Hardware AppDomain", null, newAppDomainSetup);
}
return _posAppDomain;
}
}
public static T GetHardware<T>() where T : PosHardware, new()
{
T hardware = (T)PosAppDomain.CreateInstanceFromAndUnwrap(Assembly.GetAssembly(typeof(T)).Location, typeof(T).FullName);
hardware.FindAndOpenDevice();
return hardware;
}
}
POS スキャナーがデータをスキャンするときに処理する基本的なクラスがあります。そのクラスには、データがスキャンされたときに発生させたいイベントがあります。ここにスニペットがあります:
public class ScannerDevice : PosHardware
{
public event Action<string> DataScanned;
...
_scanner.DataEvent += new DataEventHandler(Scanner_DataEvent);
...
private void Scanner_DataEvent(object sender, DataEventArgs e)
{
ASCIIEncoding encoder = new ASCIIEncoding();
if (DataScanned != null)
DataScanned(encoder.GetString(_scanner.ScanDataLabel));
_scanner.DataEventEnabled = true; // enable for subsequent scans
}
PosHardware 抽象クラスが継承MarshalByRefObject
され、マークされていることに注意してください[Serializable]
。メインの AppDomain では、次のようにイベントを使用しようとしています。
Scanner = PosHelper.GetHardware<ScannerDevice>();
Scanner.DataScanned += m =>
{
Debug.WriteLine(m);
};
ラムダを DataScanned イベントに追加しようとしている行にヒットすると、次のエラーが発生します。
ファイルまたはアセンブリ 'MyAssemlyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' またはその依存関係の 1 つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。
これは、AppDomains 間の通信の試行に関連している必要があります。何をすべきかよくわかりません。.Net の Pos に使用される別の AppDomain に "MyAssemblyName" を登録する必要がありますか?
私はプリズムを使用しているので、一部のモジュールは実行時に (出力ディレクトリのサブフォルダーに) ロードされます... 上記の最後のコード スニペットを使用するモジュールを含みます (Scanner = PosHelper.GetHardware....)