Имя: Пароль:
1C
 
Использование асинхронной библиотеки обмена сообщениями "ZeroMQ". Нужна помощь.
0 Varlant1n
 
09.12.21
16:16
Здравствуйте, дорогие форумчане. Столкнулся с проблемой при использовании библиотеки ZeroMQ. У меня стоит задача с интеграцией 1С с определенным аппаратом (сути не имеет каким). Обмен сообщений с данным аппаратом прописан с использованеим асинхронной библиотеки обмена сообщениями "ZeroMQ". Я скачал последнюю версию данной библиотеки с "https://www.nuget.org/packages/NetMQ/". Кое-как зарегистрировал через PowerShell:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe C:\netmq.4.0.1.6\lib\netstandard2.0\NetMQ.dll.

Регистрация прошла успешно. Теперь же я должен из 1С послать на аппарат JSON строку. Формирование JSON тоже прописано. Абсолютно все прописано. Главная проблема в том, что я не могу покдлючиться, а точнее использовать библиотеку "ZeroMQ". Пробовал так:

ZeroMQ = Новый ComОбъект("NetMQ");

Но 1С ругается на то, что класс не зарегистрирован. Может кто из вас работал с данной библиотекой в рамках 1С. Можете пожсказать как я могу общаться к методам из данного DLL файла. В сай DLL есть метод "Connect", который единственным параметром требует строку с IP и Порт, но использовать "Connect" я не могу, так как 1C говорит, что класс не зарегистрирован. Заранее всем спасибо за помощь! И спасибо за уделенное время!
1 pechkin
 
09.12.21
16:19
кастую в тему NetObjectToIDispatch45
2 DrShad
 
09.12.21
16:26
вангую что библиотека нативаня
3 Varlant1n
 
09.12.21
16:27
(2) А если отталкиваться от того, что она нативная. Есть возможность использования методов данной библиотеки в 1С?
4 pechkin
 
09.12.21
16:27
(2) это же библиотека под .Net и вызывать ее нужно из .Net
5 pechkin
 
09.12.21
16:28
(3) возможность есть, гугли (1). Может и автор заглянет
6 acht
 
09.12.21
16:31
(0) > с определенным аппаратом (сути не имеет каким)
Очень Секретный Кассовый Аппарат, ага.

> Но 1С ругается на то, что класс не зарегистрирован.
Откуда появилась мысль, что там все ComVisible?
7 acht
 
09.12.21
16:32
(2) > библиотека нативаня
Боже упаси, там чистый c#, который про 1С в страшном сне не знает
8 acht
 
09.12.21
16:32
(1) > кастую в тему NetObjectToIDispatch45
Пребиваю каст призывом гарикома. Микросервис на го!
9 Varlant1n
 
09.12.21
16:34
(7) При этом точно подобную библиотеку "pdTcpIpService", которая была собрана на основе "NetMQ" тоже на чистом С#, я смог использовать через ComОбъект. И мне доступны все методы.
10 acht
 
09.12.21
16:34
(8)+ А хотя и сергинио тоже. Ъ! Ъ! Ъ! =]
11 Varlant1n
 
09.12.21
16:35
pdTcpIpService= Новый ComОбъект("pdTcpIpService.pdTcpIpManager");

И все методы из бибилиотеки доступны в 1С.
12 Serginio1
 
09.12.21
16:35
(0) Ну судя по netstandard2.0 подойдет и NetObjectToIDispatch45
https://ru.stackoverflow.com/questions/527763/%d0%9a%d0%b0%d0%ba-%d0%b2%d1%8b%d0%b7%d0%b2%d0%b0%d1%82%d1%8c-%d0%bc%d0%b5%d1%82%d0%be%d0%b4-%d0%b8%d0%b7-c-%d0%b2-1%d0%a1/527802#527802
(9) Она была сделана как ComVisible
13 acht
 
09.12.21
16:36
(9) Ну правда же, что это _другая_ бибилиотека, с _другим_ кодом?
14 УдавВПопугаях
 
09.12.21
16:37
епырст, касты работают
15 Kassern
 
09.12.21
16:38
(13) там dll и тут dll, все одинаково же))
16 PLUT
 
09.12.21
16:39
(10) сергинио худеет

Ветка о похудении. Часть 2
17 PLUT
 
09.12.21
16:40
+(16) блин (12) не заметил :)) ссори
18 Varlant1n
 
09.12.21
16:41
(15) Именно так))) Ладно, не в тему было, понял, что глупость написал. А за каст в "Serginio1" отдельное спасибо. Будем посмотреть, как говорится. Щас попробую через "NetObjectToIDispatch45".
19 Serginio1
 
09.12.21
16:41
(17) Не. Я не худею. Просто ем много и много сжигаю!
20 PLUT
 
09.12.21
16:46
21 Varlant1n
 
09.12.21
17:06
Ребят. последний хелп от вас нужен. У меня просто вообще опыта работы с C# нет. Я смог через "NetObjectToIDispatch45" подключиться к dll:

NetObjectToIDispatch45= новый COMОбъект("NetObjectToIDispatch45");
nfrascturcture = NetObjectToIDispatch45.ПолучитьТипИзСборки("NetMQ.INetMQSocket", "C:\netmq.4.0.1.6\lib\netstandard2.0\NetMQ.dll");

В DLL есть метод:

.method public hidebysig newslot abstract virtual
          instance void  Connect(string address) cil managed
{
} // end of method INetMQSocket::Connect

У меня есть IP и порт, которые я должен туда послать. Но как вызвать этот метод через NetObjectToIDispatch45?

Пробовал NetObjectToIDispatch45.Connect(ip+port), но метод не обнаружен.
22 polosov
 
09.12.21
17:33
Короче надо засесть как-нибудь и Native API ВК сделать для zeroMQ.
23 Serginio1
 
09.12.21
17:34
(21) Открой для себя https://www.jetbrains.com/ru-ru/decompiler/
Стоит почитать https://infostart.ru/1c/articles/448668/
24 Serginio1
 
09.12.21
17:38
Ты объект то создал nfrascturcture ?
25 Shamandafil
 
10.12.21
08:11
Для работы с этой кассой (ZeroMQ) можно без особых проблем собрать как СОМ объект видимый из 1С без посредников вроде (NetObjectToIDispatch45), так и написать на числом С++ родную для 1С ВК.
А вот кассу для pdTcpIpService писали наркоманы, там всё не по человечески и с силами всё переписать я так и не собрался.
26 Serginio1
 
10.12.21
10:06
(25) Так или иначе ты будешь писать того же посредника, только вручную. Прелесть NetObjectToIDispatch45 еще и в том, что один раз зарегистрировал и вызываешь любые нетовские сборки (.NetStandard 2). Или можешь сделать свою сборку без COM ограничений (все типы должны быть примитивными или использовать IDispatch)
27 Shamandafil
 
10.12.21
12:02
(26) NetObjectToIDispatch45 использовал не раз. Но натив ДЛЛ гораздо удобнее, не требует прав администратора и устанавливается сама.
С другой стороны никакая обёртка не защитит от кривого кода (pdTcpIpService), который использует Dictionary без блокировок в многопоточном коде для хранения журнала событий. Причём этот словарь падает вместе с процессом 1С, если время 2х событий совпадёт (словарь не может хранить одинаковые ключи типа DateTime), самое грустное, что обработчик ошибок сам же эту ошибку и вызывает пытаясь писать в словарь.
28 Serginio1
 
10.12.21
12:44
(27) В свое время сделал и нативную обертку
Кроссплатформенное использование классов .Net в 1С через Native ВК. Или замена COM на Linux
https://infostart.ru/1c/articles/534901/
Но как то она не особо пользовалась спросом.
Сейчас нужно пересобрать под новые версии https://docs.microsoft.com/ru-ru/dotnet/core/tutorials/netcore-hosting
А для линукса добавить условную компиляцию

Интерфейсы API среды выполнения .NET Core находятся в coreclr.dll (в Windows), в libcoreclr.so (на платформе Linux) или в libcoreclr.dylib (в macOS). Первым шагом для размещения .NET Core является загрузка библиотеки CoreCLR. Некоторые основные приложения проверяют разные пути или используют входные параметры для поиска библиотеки, пока другие могут загрузить ее по заранее определенному пути (рядом с основным приложением, например, или из известного расположения на компьютере).
После обнаружения библиотека загружается с помощью LoadLibraryEx (в Windows) или dlopen (в Linux или macOS).