OPOS 库 v1.14 无法按预期使用 .net 的 x64 版本

OPOS library v1.14 is not working as expected with x64 build of .net

我们在桌面应用程序中使用 OPOS 驱动程序 v 1.11,现在将其迁移到 v 1.14。 该应用程序在 x86 架构上的较新版本上运行良好,但在编译为 x64 时,它会抛出 class 未注册的运行时错误。 第一次尝试初始化对象 class 的新实例时遇到异常。 调用新实例时,

oPOSPOSPrinter = new OPOSPOSPrinter();

抛出的异常是,

System.Runtime.InteropServices.COMException
HResult=0x80040154
Message=Retrieving the COM class factory for component with CLSID {CCB90152-B81E-11D2-AB74-0040054C3719} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
Source=mscorlib

我们在这里引用的 dll 是 32 位版本,我们的应用程序是在 64 位上编译的。

我们尝试通过 regsvr32 工具注册它,但它也在那里抛出异常。

我们尝试手动将其添加到注册表,但没有帮助。

我们尝试了两个版本,一个来自默认的 OPOS 安装目录,另一个来自同一目录中的 OposFor.Net 文件夹。

那么,想请教一下如何实现呢? 我们希望将我们的应用程序迁移到 x64 架构上,并支持 OPOS v 1.11 到 OPOS v 1.14 的所有当前功能。 另外,是否会在不久的将来提供 64 位版本的 OPOS 驱动程序?

系统和应用信息: OS: Windows 10 专业版 IDE:对比 2017, .Net 版本:.Net 4 + OPOS dll 版本:1.14.001

UnifiedPOS(包括OPOS)规范只支持32位。

Download the current version 1.14.1 of UnifiedPOS
第 A-1 页

The goals of OLE for Retail POS (or "OPOS") include:
- Defining an architecture for Win32-based POS device access.
- Defining a set of POS device interfaces sufficient to support a range of POSsolutions.

第 A-3 页

A CO is a standard ActiveX (that is, OLE 32-bit) Control that is invisible at runtime.

普通CO只支持32位
MCS: OPOS Common Control Objects - Current Version

我实验性地创建了支持 64 位的 Common CO,但这是非正式的。
kunif/OPOS-CCO

如果在POSfor.NET中使用OPOS作为服务对象,需要用32位操作。

对于在64位OS中运行的32位exe/dll,相应的注册表数据在WOW6432Node下的不同位置分离。
但是,有些注册表以 64/32 分隔,有些注册表 link 以 64/32 分隔,依此类推。

虽然设备供应商可能独立支持64位,但被认为是少数。

以下建议是可行的。

  1. 将应用程序分成两个或多个进程,并link它们通过进程间通信。
    64 位进程中的主应用程序 运行。
    I/O control(OPOS) 应用程序以 32 位进程运行。
  2. 仅使用独立支持 64 位的供应商设备和 OPOS。
  3. 使用 64 位应用程序中的 32 位 OPOS,使用评论中描述的技术。

另外:
方法补充资料“3”。如下。

DLL Surrogates
DLL Server Requirements
Using the System-Supplied Surrogate
Writing a Custom Surrogate

Interfaces that aren't remotable (such as those for recent OCXs) will not work with the system surrogate. A custom surrogate could wrap the DLL's interfaces with its own implementation and use proxy/stub DLLs with a remotable IDL definition that would allow the interface to be remoted.

Whosebug 文章中的

Accessing 32-bit DLLs from 64-bit code
Accessing 32-bit DLLs from 64-bit code 原创文章

How do I make COM Surrogate Multiple Instance?
Hosting a .NET DLL as an Out-Of-Process COM Server (EXE)
DllSurrogate
REGCLS Enumeration

64 位进程无法在其进程中直接调用 32 位库。您需要采用不同的方法与 32 位库通信。

  • 创建一个单独的 32 位 exe,它将执行您想要的操作 使用该 32 位库实现,并从您的 64 位进程调用该 exe,并通过传递正确的参数,您可以根据这些参数识别调用及其操作,并且您可以 return 将所需的输出输出到您的进程。
  • 您还可以创建基于 WebSocket 的 client/server 应用程序,并且可以 与您的 64 位进程通信,这会更快 方法然后一个 exe
  • 或者,您也可以创建一个 WCF 服务,您可以在其中使用 您的 32 位 dll 并在您的 64 位中使用该 WCF 服务 申请并完成。

注意:如果通信需要发生在同一台机器上(意味着你的 64 位应用程序和 32 位库将在同一台机器上)在这种情况下首先两个选项将是最好的选择。

希望此信息对您有所帮助,并能帮助您继续前进。

快乐编码...