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位,但被认为是少数。
以下建议是可行的。
- 将应用程序分成两个或多个进程,并link它们通过进程间通信。
64 位进程中的主应用程序 运行。
I/O control(OPOS) 应用程序以 32 位进程运行。
- 仅使用独立支持 64 位的供应商设备和 OPOS。
- 使用 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 位库将在同一台机器上)在这种情况下首先两个选项将是最好的选择。
希望此信息对您有所帮助,并能帮助您继续前进。
快乐编码...
我们在桌面应用程序中使用 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位,但被认为是少数。
以下建议是可行的。
- 将应用程序分成两个或多个进程,并link它们通过进程间通信。
64 位进程中的主应用程序 运行。
I/O control(OPOS) 应用程序以 32 位进程运行。 - 仅使用独立支持 64 位的供应商设备和 OPOS。
- 使用 64 位应用程序中的 32 位 OPOS,使用评论中描述的技术。
另外:
方法补充资料“3”。如下。
DLL Surrogates
DLL Server Requirements
Using the System-Supplied Surrogate
Writing a Custom Surrogate
Whosebug 文章中的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.
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 位库将在同一台机器上)在这种情况下首先两个选项将是最好的选择。
希望此信息对您有所帮助,并能帮助您继续前进。
快乐编码...