0

我有一个 WPF 销售点应用程序,我最近将它从 net48 移植到 netcore3.1(真是太棒了!)。在应用程序中,我通过 POS4NET 服务对象 (HHSO4NET.dll) 使用 Honeywell Voyager 1200g 扫描简单的条形码,一切都很好。然而在新的netcore3.1世界里,我再也无法打开设备了。我收到以下错误:-

`Microsoft.Pointofservice.management.Explorer 的类型初始化程序

找不到方法:“无效 System.AppDomainSetup.set_ApplicationBase(System.String)”。

我认为在 dotnet 核心运行时中有一些东西现在在网络框架中不可用。所以,我决定在 UWP 世界中寻找 Windows.Devices.PointOfService 来帮助我集成扫描仪(这是一个受支持的模型)。

为了能够引用这些 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 应用程序以某种方式相同的方式获取事件有关。

我在这里缺少什么吗?

4

2 回答 2

0

根据评论中的对话重写:

问题文章所附的以下评论似乎是有效的。


顺便说一句,这(Windows.Devices.PointOfService)是否可以自然地与 .NET 4.8 WPF(从不 UWP)而不是 .NET Core 一起使用?如果它不适用于 .NET 4.8 WPF,它可能不适用于 .NET Core。最好通过这么小的改动一点一点的去调查。

也许它只是在重现相同的情况。但是使用编写良好的 WPF 应用程序而不是控制台应用程序来尝试它是有意义的。

这可能是因为您没有claimedBarcodeScanner.IsDecodeDataEnabled = true;在 DataReceived 事件处理程序中执行此操作。数据在条码扫描器服务中缓冲,而事实并非如此。这与 POS for.NET 和 OPOS 的 DataEventEnabled 属性的机制相同。


ps
请注意,上一篇文章的评论将被删除。


另一方面,问题文章中提到的 NuGet 包是由第三方制作的,并在 2016 年 11 月完成,所以换用这个微软产品可能会更好。

Windows 10 WinRT API 包发布
Microsoft.Windows.SDK.Contracts 10.0.19041.1
版本自适应代码
Windows 运行时 API 可用于桌面应用程序

而.NET 5 将在今年秋季或冬季发布,并且机制会发生变化。
支持 .NET 5 中的 WinRT API #35318
C#/WinRT

于 2020-07-14T12:11:04.040 回答
0

一个非常基本的编程错误。

在复制 UWP 示例代码时,我没有意识到我已在本地将 claimBarcodeScanner 对象限定为 Initialise 方法。

Initialise 方法完成后,引用丢失并且没有捕获任何事件。

感谢 kunif 的重要建议:“尝试使用编写良好的 WPF 应用程序而不是控制台应用程序是有意义的”

...我可以确认,这个 POS 库适用于网络框架、网络核心框架和 UWP。

于 2020-07-14T22:57:19.130 回答