Използвам следния помощен клас с POS за .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“ или една от неговите зависимости. Системата не може да намери посочения файл.
Това трябва да е свързано с опит за комуникация между AppDomains. Не съм сигурен какво да правя. Трябва ли да регистрирам „MyAssemblyName“ в отделния AppDomain, използван за Pos за .Net?
Използвам prism, така че някои модули се зареждат по време на изпълнение (в подпапка в изходната ми директория)... включително този, в който използвам последния кодов фрагмент по-горе (Scanner = PosHelper.GetHardware....)