首页 > 解决方案 > OPOS 库 v1.14 在 x64 版本的 .net 中无法正常工作

问题描述

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

oPOSPOSPrinter = new OPOSPOSPrinter();

抛出的异常是,

System.Runtime.InteropServices.COMException
HResult=0x80040154
消息=检索具有 CLSID {CCB90152-B81E-11D2-AB74-0040054C3719} 的组件的 COM 类工厂失败,原因是以下错误:80040154 未注册类(来自 HRESULT 的异常:0x80040154( REGDB_E_CLASSNOTREG))。
源=mscorlib

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

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

在此处输入图像描述

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

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

所以,我们想问一个解决方案,如何实现这一目标?我们希望在 x64 架构上迁移我们的应用程序,并在 OPOS v 1.14 上支持 OPOS v 1.11 中的所有当前功能。另外,在不久的将来是否会有 64 位版本的 OPOS 驱动程序可用?

系统和应用信息:操作系统:Windows 10 Pro IDE:VS 2017,.Net 版本:.Net 4 + OPOS dll 版本:1.14.001

标签: x8664-bit32bit-64bitwinforms-interopopos

解决方案


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


下载 UnifiedPOS页面 A-1 的当前版本 1.14.1

零售 POS(或“OPOS”)的 OLE 目标包括:
- 为基于 Win32 的 POS 设备访问定义体系结构。
- 定义一组足以支持一系列 POS 解决方案的 POS 设备接口。

A-3 页

CO 是在运行时不可见的标准 ActiveX(即 OLE 32 位)控件。

Common CO 仅支持 32 位。
MCS:OPOS 通用控制对象 - 当前版本

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

如果在 POS for.NET 中使用 OPOS 作为服务对象,则需要使用 32 位进行操作。

对于在 64 位操作系统中运行的 32 位 exe/dll,相应的注册表数据在 WOW6432Node 下的各个位置分开。
但是,有些注册表是用 64/32 分隔的,有些注册表是用 64/32 链接的,等等。

尽管设备供应商可能独立支持 64 位,但被认为很少。

以下建议是可能的。

  1. 将应用程序划分为两个或多个进程,并通过进程间通信将它们链接起来。
    以 64 位进程运行的主应用程序。
    以 32 位进程运行的 I/O 控制 (OPOS) 应用程序。
  2. 仅使用独立支持 64 位的供应商设备和 OPOS。
  3. 使用 64 位应用程序中的 32 位 OPOS,使用注释中描述的技术。

另外:
关于“3.”方法的补充信息。如下。

DLL 代理项 使用系统提供的代理项编写自定义代理项的
DLL 服务器要求

不可远程的接口(例如最近的 OCX 接口)将无法与系统代理一起使用。自定义代理可以用自己的实现包装 DLL 的接口,并使用代理/存根 DLL 和允许远程接口的可远程 IDL 定义。

在 StackOverflow 文章中从 64 位代码
访问 32 位 DLL 从 64 位代码访问 32 位 DLL原创文章

如何制作 COM 代理多个实例?
将 .NET DLL 托管为进程外 COM 服务器 (EXE)
DllSurrogate
REGCLS 枚举


推荐阅读