x86 - 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
解决方案
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 位,但被认为很少。
以下建议是可能的。
- 将应用程序划分为两个或多个进程,并通过进程间通信将它们链接起来。
以 64 位进程运行的主应用程序。
以 32 位进程运行的 I/O 控制 (OPOS) 应用程序。 - 仅使用独立支持 64 位的供应商设备和 OPOS。
- 使用 64 位应用程序中的 32 位 OPOS,使用注释中描述的技术。
另外:
关于“3.”方法的补充信息。如下。
DLL 代理项 使用系统提供的代理项编写自定义代理项的
DLL 服务器要求
不可远程的接口(例如最近的 OCX 接口)将无法与系统代理一起使用。自定义代理可以用自己的实现包装 DLL 的接口,并使用代理/存根 DLL 和允许远程接口的可远程 IDL 定义。
在 StackOverflow 文章中从 64 位代码
访问 32 位 DLL 从 64 位代码访问 32 位 DLL原创文章
如何制作 COM 代理多个实例?
将 .NET DLL 托管为进程外 COM 服务器 (EXE)
DllSurrogate
REGCLS 枚举
推荐阅读
- javascript - Cronjob 停止执行 nodejs
- git - Git:如何打开我本地分支的拉取请求 URL?
- google-apps-script - setFormula 在值前添加“=”
- node.js - 尝试安装 node-sass 的纱线问题
- php - 如何访问数组中的“删除帖子”按钮以删除用户帖子
- r - 在-axis ggplot中排序几个因子变量
- reactjs - React Leaflet Map 无法正确渲染
- python - 我需要什么 SQL 语句将数据插入当前为“空”的多行?
- android - Kotlin - Firebase 数据库 - 将 DataSnapShot 转换为 Hashmap
- bash - 替换或更新 bash 脚本中的一行