Библиотека OPOS v1.14 не работает должным образом со сборкой xnet .net - PullRequest
0 голосов
/ 21 февраля 2019

Мы используем драйверы OPOS v 1.11 в нашем настольном приложении и теперь переносим его на v 1.14.Приложение отлично работает с более новой версией архитектуры x86, но при компиляции в x64 выдает ошибку времени выполнения для незарегистрированного класса.Исключение встречается при самой первой попытке инициализации нового экземпляра класса объекта.Когда вызывается для нового экземпляра,

oPOSPOSPrinter = new OPOSPOSPrinter();

Выдается исключение:

System.Runtime.InteropServices.COMException
HResult = 0x80040154
Сообщение = получение COMФабрика классов для компонента с CLSID {CCB90152-B81E-11D2-AB74-0040054C3719} не выполнена из-за следующей ошибки: 80040154 Класс не зарегистрирован (исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
Source = mscorlib

dll, который мы здесь ссылаемся, является 32-битной версией, а наше приложение скомпилировано на 64-битной.

Мы попытались зарегистрировать его с помощью инструмента regsvr32, но затем оно также выдает исключение.

enter image description here

Мы пытались вручную добавить его в реестр, но это не помогло.

Мы пытались использовать обе версии, одну изкаталог установки OPOS по умолчанию и еще один из папки OposFor.Net в том же каталоге.

Итак, мы хотели бы спросить, как этого добиться?Мы хотим перенести наше приложение на архитектуру x64 и поддерживать все текущие функциональные возможности из OPOS v 1.11 в OPOS v 1.14.Кроме того, появится ли в ближайшем будущем 64-разрядная версия драйверов OPOS?

Информация о системе и приложении: ОС: Windows 10 Pro IDE: VS 2017, версия .Net: .Net 4 + OPOS dllВерсия: 1.14.001

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

64-битный процесс не может напрямую вызывать 32-битную библиотеку в своем процессе.У вас должен быть другой подход для общения с 32-битной библиотекой.

  • Создайте отдельный 32-битный exe-файл, который будет делать то, что вы хотите достичь с помощью этой 32-битной библиотеки, и вызовите этот exe из вашего64-битный процесс и путем передачи правильных параметров, на основе которых вы можете идентифицировать вызов и его действие, и вы можете вернуть желаемый результат в ваш процесс.
  • Вы также можете создать клиент-серверное приложение на основе WebSocket иможет взаимодействовать с вашим 64-битным процессом, который может быть гораздо более быстрым, чем exe
  • . Альтернативно, вы также можете создать службу WCF, где вы можете использовать 32-битную DLL и использовать эту службу WCF в вашей 64-битнойПриложение и покончим с этим.

Примечание: Если связь должна происходить на одной машине (значит, ваше 64-битное приложение и 32-битная библиотека будут находиться вна той же машине), в этом случае лучше всего будут работать первые два варианта.

Надеюсь, эта информация поможети помочь вам продолжить.

Счастливое кодирование ...

0 голосов
/ 21 февраля 2019

Спецификация UnifiedPOS (включая OPOS) поддерживает только 32 бит.

Загрузить текущую версию UnifiedPOS 1.14.1
Страница A-1

Цели OLE для POS в розничной торговле (или «OPOS»)include:
- Определение архитектуры для доступа к POS-устройству на основе Win32.
- Определение набора интерфейсов POS-устройств, достаточного для поддержки ряда POS-решений.

Страница A-3

CO - это стандартный ActiveX (то есть OLE 32-битный) элемент управления, который невидим во время выполнения.

Common CO поддерживает только 32-битные.
MCS: Общие объекты управления OPOS - Текущая версия

Я экспериментально создал Common CO, который поддерживает 64-битные,но это неформально.
kunif / OPOS-CCO

Если вы используете OPOS в качестве сервисного объекта в POS для .NET, вам нужно работать с 32-битным.

Для 32-битного exe / dll, который работает в 64-битной ОС, соответствующие данные реестра разделяются под WOW6432Node в разных местах.
Однако некоторые реестры разделены 64/32, некоторые реестры связаны с 64/ 32 и т. Д.

Несмотря на то, что производители устройств могут поддерживать 64-битную систему независимо, ее считается немного

Возможны следующие предложения.

  1. Разделите приложение на два или более процессов и свяжите их посредством межпроцессного взаимодействия.
    Основное приложение, работающее с 64-разрядным процессом.
    Приложение управления вводом / выводом (OPOS), работающее с 32-разряднымпроцесс.
  2. Используйте только оборудование поставщика и OPOS, которые независимо поддерживают 64-битную версию.
  3. Используйте 32-битный OPOS из 64-битного приложения, используя методы, подобные описанным в комментариях.

Дополнительно:
Дополнительная информация о методе «3».как следует.

Суррогаты DLL
Требования к серверу DLL
Использование системного суррогата
Написание пользовательскогоСуррогат

Интерфейсы, которые не являются удаленными (например, для последних OCX), не будут работать с суррогатом системы.Пользовательский суррогат может обернуть интерфейсы библиотеки DLL своей собственной реализацией и использовать DLL прокси / заглушки с удаленным определением IDL, которое позволит удаленному интерфейсу.

Доступ к 32-битным DLL из 64-битного кода в статье StackOverflow
Доступ к 32-битным DLL из 64-битного кода Оригинальная статья

Как создать суррогатный COM-экземпляр?
Размещение DLL-библиотеки .NET в качестве внепроцессного COM-сервера (EXE)
DllSurrogate
REGCLS Перечисление

...