.Net knihovna pod Linuxem

Kryštof

.Net knihovna pod Linuxem
« kdy: 26. 03. 2018, 18:07:36 »
Dobrý den,

mám prosbu a dotaz. Pro stahování dat z PLC používáme MX Components a z nich knihovnu .dll pro přímé spojení s konkrétním PLC. Dosud jsme data stahovali pomocí vyřazeného PC s WinXP. Rád bych jej vyhodil a přesunul aplikaci pro stahování na Linuxový server. Jedná se o konzolovou aplikaci,která se v pravidelných intervalech připojuje k PLC a stažená data ukládá na SQL server.

Myslel jsem, že bych napsal v Mono aplikaci, která by tuto knihovnu využila. Začal jsem samotnou kostrou

Kód: [Vybrat]
using System;
using ACTETHERLib;

namespace Melsec
{
class Program
{       
static void Main(string[] args)
{
ActFXENETTCP plc = new ActFXENETTCP();
Console.WriteLine("Start ...");

}
}
}

Po přeložení
Kód: [Vybrat]
mcs melsec.cs /reference:Interop.ACTETHERLib.dll

mi aplikace chodila chybu
Kód: [Vybrat]
Unhandled Exception:
System.DllNotFoundException: ole32.dll
  at (wrapper managed-to-native) System.__ComObject.CoCreateInstance(System.Guid,intptr,uint,System.Guid,intptr&)
  at System.__ComObject.CreateIUnknown (System.Type t) [0x00051] in <62351af909f64c3d9f8698380a6f7518>:0
  at Mono.Interop.ComInteropProxy.CreateProxy (System.Type t) [0x00000] in <62351af909f64c3d9f8698380a6f7518>:0
  at System.Runtime.Remoting.RemotingServices.CreateClientProxyForComInterop (System.Type type) [0x00000] in <62351af909f64c3d9f8698380a6f7518>:0
  at System.Runtime.Remoting.Activation.ActivationServices.CreateProxyForType (System.Type type) [0x0003b] in <62351af909f64c3d9f8698380a6f7518>:0
  at (wrapper managed-to-native) System.Object.__icall_wrapper_ves_icall_object_new_specific(intptr)
  at Melsec.Program.Main (System.String[] args) [0x00000] in <b06b9891e8c04e19803d3da7277465a3>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.DllNotFoundException: ole32.dll
  at (wrapper managed-to-native) System.__ComObject.CoCreateInstance(System.Guid,intptr,uint,System.Guid,intptr&)
  at System.__ComObject.CreateIUnknown (System.Type t) [0x00051] in <62351af909f64c3d9f8698380a6f7518>:0
  at Mono.Interop.ComInteropProxy.CreateProxy (System.Type t) [0x00000] in <62351af909f64c3d9f8698380a6f7518>:0
  at System.Runtime.Remoting.RemotingServices.CreateClientProxyForComInterop (System.Type type) [0x00000] in <62351af909f64c3d9f8698380a6f7518>:0
  at System.Runtime.Remoting.Activation.ActivationServices.CreateProxyForType (System.Type type) [0x0003b] in <62351af909f64c3d9f8698380a6f7518>:0
  at (wrapper managed-to-native) System.Object.__icall_wrapper_ves_icall_object_new_specific(intptr)
  at Melsec.Program.Main (System.String[] args) [0x00000] in <b06b9891e8c04e19803d3da7277465a3>:0
Můžete mě prosím pěkně nakopnout, zda je vůbec moje úvaha správná? Můžu pod Mono nějak jednoduše používat knihovny z Windows? Případně zda byste jinou cestou.
Teprve se učím a tak prosím o shovívavost a jen konstruktivní odpovědi. Jsem jen údržbář :) Něco jsem zkoušel googlit, ale moc moudrý z toho nejsem.


jm

Re:.Net knihovna pod Linuxem
« Odpověď #1 kdy: 26. 03. 2018, 18:21:44 »
Jestli to chápu správně, tak si mono (.NET) stěžuje, že nemůže najít COM knihovnu, která je slinkovaná s ActFXENETTCP wrapperem. Tzn že řešíš problém, jak zaregistrovat a rozjet COM knihovnu "ACTETHERLib.dll" pod Linuxem.

Kryštof

Re:.Net knihovna pod Linuxem
« Odpověď #2 kdy: 26. 03. 2018, 18:29:51 »
Aplikace mi jde přeložit, hodí jen varování, že objekt plc je deklarován, ale není použit. Když ji zkusím spustit, tak to hodí tu chybu.
Nevím bohužel o jiném způsobu, jak se k PLC připojit jinak než přes tu knihovnu.
Chápu tu tak, že si ta knihovna volá další knihovnu, ale tu už se mi nedaří "přilinkovat".

Zkoušel jsem okolo toho hledat na netu a našel jsem tohle
http://linux.lsdev.sil.org/wiki/index.php/COM_in_Linux
ale na pochopení toho už moje znalosti nestačí.  :-[

jm

Re:.Net knihovna pod Linuxem
« Odpověď #3 kdy: 26. 03. 2018, 18:40:33 »
Je to tak jak píšeš. Ten Interop.ACTETHERLib.dll je vygenerované .NET rozhraní pro COM knihovnu, která je uložená někde na HDD počítače. COM knihovna se na Windows zaregistruje skrze
cmd -> regsvr32 <cesta ke COM.dll>
a poté přes COM rozhraní můžeš přistoupit z libovolné aplikace, aniž by to danou knihovnu musela s sebou tahat, protože ta je zaregistrována na COM serveru.

Nicméně jak přesně nastavit Linux, aby fungoval s COM knihovnami, to opravdu netuším a nejspíše ti nebudu schopný pomoci. Dle toho co jsi poslal v tom linku jde o rozjetí COM serveru na Linuxu podobným způsobem jako běží Windows.

Kryštof

Re:.Net knihovna pod Linuxem
« Odpověď #4 kdy: 26. 03. 2018, 18:45:59 »
Díky moc za nakopnutí, zkusím pátrat a hledat nějaký příklad.



.

Re:.Net knihovna pod Linuxem
« Odpověď #5 kdy: 26. 03. 2018, 19:02:26 »
DLL pro Windows je pro Windows. Možná uspěješ s Wine.

Daniel Kozak

Re:.Net knihovna pod Linuxem
« Odpověď #6 kdy: 26. 03. 2018, 19:46:47 »
Díky moc za nakopnutí, zkusím pátrat a hledat nějaký příklad.

Tak pokud nemaji verzi pro Linux nebo dostupne zdrojaky, tak bych se na to vykaslal a sel cestou wine. Usetris si stim dost prace

Jester

Re:.Net knihovna pod Linuxem
« Odpověď #7 kdy: 26. 03. 2018, 20:28:03 »
Aplikace mi jde přeložit, hodí jen varování, že objekt plc je deklarován, ale není použit. Když ji zkusím spustit, tak to hodí tu chybu.
Nevím bohužel o jiném způsobu, jak se k PLC připojit jinak než přes tu knihovnu.
Chápu tu tak, že si ta knihovna volá další knihovnu, ale tu už se mi nedaří "přilinkovat".

Zkoušel jsem okolo toho hledat na netu a našel jsem tohle
http://linux.lsdev.sil.org/wiki/index.php/COM_in_Linux
ale na pochopení toho už moje znalosti nestačí.  :-[
Jakmile kód v .NET volá nativní kód, ať už přes COM nebo IJW nebo jinak, tak má Mono problém, protože příslušné "vázací" knihovny v Mono nejsou a ty z Windows většinou na Linuxu nefungují, kromě pár výjimek. Nejjednodušší asi je mít ten počítač s Windows, pokud příslušný software není k dispozici i pro Unix/Linux.

Kryštof

Re:.Net knihovna pod Linuxem
« Odpověď #8 kdy: 26. 03. 2018, 20:51:09 »
Děkuju za odpovědi všem a za snahu. Asi to tak dopadne a nechám nějaký vyřazený stroj s Win7 bežet v serverovně. Vůbec se mi to nelíbí, ale nic lepšího mě nenapadá.
Wine mi teď doma v terminálu padá, zkusím zítra v práci.
Původně mi ten SQL server běžel na Windows Serveru 2008, ale kvůli nutnosti dokupovat CALy jsem se rozhodl celou síť migrovat na Linux. Jenže mi z toho teď vznikne takový kočkopes.

hooodini

Re:.Net knihovna pod Linuxem
« Odpověď #9 kdy: 26. 03. 2018, 21:03:01 »
IMHO bez sance rozjet tohle na Linuxu.

Bugs

Re:.Net knihovna pod Linuxem
« Odpověď #10 kdy: 27. 03. 2018, 06:15:26 »
V současné době lze pro Linux udělat CLI aplikaci přes .NET Core 2. Jenže ta PLC knihovna by musela být přeložená/přeložitelná v API .NET Core nebo .NET Standard.

Další možností by bylo dekompilovat starou knihovnu pomocí https://www.jetbrains.com/decompiler/ a naportovat si ji ručně na ten .NET Core nebo .NET Standard.

JmJ

  • ****
  • 294
    • Zobrazit profil
Re:.Net knihovna pod Linuxem
« Odpověď #11 kdy: 27. 03. 2018, 07:28:11 »
K plc strojum se vetsinou da pripojit pres modbus (snad si ten nazev nepletu).  Knihovna na modbus napsana v .net se da urcite sehnat, jednu pouzivam.  Pokud by tve plc umelo ta data, ktera od nej potrebujes, sdilet modbusem, pak bys mohl mit cistou .net aplikaci, ktera by v linuxu jela.


Kryštof

Re:.Net knihovna pod Linuxem
« Odpověď #12 kdy: 27. 03. 2018, 08:07:55 »
K plc strojum se vetsinou da pripojit pres modbus (snad si ten nazev nepletu).  Knihovna na modbus napsana v .net se da urcite sehnat, jednu pouzivam.  Pokud by tve plc umelo ta data, ktera od nej potrebujes, sdilet modbusem, pak bys mohl mit cistou .net aplikaci, ktera by v linuxu jela.
Jedná se o PLC Mitsubishi řad Fx, A a Q. Pro připojení k těm Q modulům používáme karty QJ71E71-100. Výrobce dělá utilitu MX Components a z ní jsem použil knihovnu ActEther.dll Ve Win to šlapalo uspokojivě, tak jsem neměl moc důvodů a i času to nějak řešit ( není to moje hlavní náplň práce, spíš si s tím hraju ve volném čase).

V každém případě moc děkuji za nápady

Kryštof

Re:.Net knihovna pod Linuxem
« Odpověď #13 kdy: 27. 03. 2018, 08:12:11 »
V současné době lze pro Linux udělat CLI aplikaci přes .NET Core 2. Jenže ta PLC knihovna by musela být přeložená/přeložitelná v API .NET Core nebo .NET Standard.

Další možností by bylo dekompilovat starou knihovnu pomocí https://www.jetbrains.com/decompiler/ a naportovat si ji ručně na ten .NET Core nebo .NET Standard.

To netuším, jsem C# embryo :). Původní knihovna je tady https://uloz.to/!hQf7J2IbVLn3/actether-dll a po přidání do VisualStudia z ní VS 2017 udělá toto https://uloz.to/!0sNkSrNl9KWr/interop-actetherlib-dll

Děkuju za rady a případné nakopnutí.

VojtaF

Re:.Net knihovna pod Linuxem
« Odpověď #14 kdy: 27. 03. 2018, 09:19:40 »
Je nekolik moznosti jak pouzit puvodni dll bez rekompilace:

https://github.com/taviso/loadlibrary
http://ndiswrapper.sourceforge.net/wiki/index.php/Main_Page
https://wiki.winehq.org/Winelib_User%27s_Guide

nejmene starosti ale bude asi to Wine