У меня есть приложение WPF для точек продаж, которое я недавно портировал с net48 на netcore3.1 (какая работа!). В приложении я использую Honeywell Voyager 1200g через служебный объект POS 4NET (HHSO 4NET .dll) для сканирования простых штрих-кодов, и все прошло хорошо. Однако в новом мире netcore3.1 я больше не мог открывать устройство. Я получил следующую ошибку: -
Инициализатор типа для `Microsoft.Pointofservice.management.Explorer
Метод не найден: 'Void System.AppDomainSetup. set_ApplicationBase (System.String) '.
Я предполагаю, что сейчас что-то недоступно в основной среде выполнения do tnet, что раньше было в структуре net. Итак, я решил обратиться к Windows .Devices.PointOfService в мире UWP, чтобы помочь мне интегрировать сканер (который является поддерживаемой моделью).
Чтобы иметь возможность ссылаться на эти библиотеки UWP, я следовал следующему руководству, в котором описывается добавление некоторых дополнительных ссылок
https://blogs.windows.com/windowsdeveloper/2017/01/25/calling-windows-10-apis-desktop-application/
Теперь я могу найти, потребовать и открыть сканер просто отлично! Но вроде бы никакие события не обрабатываются. Мой код почти идентичен образцу UWP: -
string selector = BarcodeScanner.GetDeviceSelector();
DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);
var device = deviceCollection.FirstOrDefault();
if (device != null)
{
barcodeScanner = await BarcodeScanner.FromIdAsync(device.Id);
if (barcodeScanner != null)
{
//after successful creation, claim the scanner for exclusive use
var claimedBarcodeScanner = await barcodeScanner.ClaimScannerAsync();
if (claimedBarcodeScanner != null)
{
//Subscribe to the events
claimedBarcodeScanner.ReleaseDeviceRequested += ClaimedBarcodeScanner_ReleaseDeviceRequested;
claimedBarcodeScanner.DataReceived += WhenScannerDataReceived;
claimedBarcodeScanner.IsDecodeDataEnabled = true;
//after successful claim, enable scanner for data events to fire
await claimedBarcodeScanner.EnableAsync();
}
else
{
FrameworkDI.Logger.LogErrorSource("Failure to claim barcodeScanner");
}
}
else
{
FrameworkDI.Logger.LogErrorSource("No Barcode Scanner Present");
}
}
else
{
FrameworkDI.Logger.LogErrorSource("No Barcode Scanner Present");
}
private void WhenScannerDataReceived(object sender, DataEventArgs args)
{
string symbologyName = BarcodeSymbologies.GetName(args.Report.ScanDataType);
var scanDataLabelReader = DataReader.FromBuffer(args.Report.ScanDataLabel);
string barcode = scanDataLabelReader.ReadString(args.Report.ScanDataLabel.Length);
}
С точкой останова в обработчике я не могу попасть в событие. Я загрузил образец приложения UWP и запустил его, используя тот же компьютер / сканер, и он захватил все события и отлично прочитал данные, поэтому я предполагаю, что сканер генерирует события. Это должно быть связано с тем, что приложение WPF не получает события так же, как приложение UWP.
Что-то мне здесь не хватает?