OPOS库v1.14与.net的x64版本无法正常工作

问题描述 投票:3回答:2

我们在桌面应用程序中使用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工具注册它,但之后它也会抛出异常。

enter image description here

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

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

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

系统和应用程序信息:操作系统:Windows 10关于IDE:Sun 2017,.No版本:.No 4 + OPOS dll版本:1.14.001

x86 64bit 32bit-64bit winforms-interop opos
2个回答
2
投票

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

  • 创建一个单独的32位exe,它将使用该32位库执行您想要实现的目标,并从64位进程调用该exe并通过传递正确的参数,您可以根据该参数识别呼叫及其操作,您可以将所需的输出返回到您的进程。
  • 您也可以创建一个基于WebSocket的客户端/服务器应用程序,并可以与您的64位进程进行通信,这可能是一个比exe更快的方法
  • 另外,您也可以创建一个WCF服务,在这里您可以使用32位dll并在64位应用程序中使用该WCF服务并完成该操作。

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

希望这些信息有所帮助,可以帮助您继续前进。

快乐编码......


2
投票

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

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

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

第A-3页

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

Common CO仅支持32位。 MCS: OPOS Common Control Objects - Current Version

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

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

对于在64位OS中运行的32位exe / dll,相应的注册表数据在WOW6432Node的varius位置分隔。 但是,一些注册表由64/32分隔,一些注册表与64/32相关联,依此类推。

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

以下建议是可能的。

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

此外: 关于“3.”方法的补充资料如下。

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

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

StackOverflow文章中的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

© www.soinside.com 2019 - 2024. All rights reserved.