Forum: PC-Programmierung Linux Mono dll in c# einbinden


von Mono_User (Gast)


Lesenswert?

Hi ich hab unter Windows in VS 2005 ein C# Projekt erstellt das eine dll 
datei enthält.
Jetzt will ich das Projekt mit Mono unter Linux zum laufen bringen.
Die dll Datei heißt cpdll.dll
Hab jetzt ein File mit dem Namen cpdll.dll.config erstellt:

<configuration>
<dllmap dll="cpdll.dll" target="./cplib.so"/>
</configuration>

eingebunden wird die datei in c# wie folgt:

[DllImport("cplib")]
public static extern void funktion (void);

Kompilieren klappt ohne Fehler, beim Programmstart kommt jedoch die 
Meldung:
System.DllNotFoundException: cplib

Hab das config File schon in den bin/debug ordner kopiert und ins 
Projektverzeichnis jedoch ändert sich nichts.

Die Datei cplib.so kann ich auch nirgends finden, muss ich das config 
file noch irgendwie aktivieren oder wie funktioniert das.

Hoffe ihr könnt mir helfen.
Mfg

von Zwie B. (zwieblum)


Lesenswert?

Wenn's keine cplib.so gibt, kannst du die auch nicht importieren. Also 
besorg' dir erst mal cplib.so für Linux.

von Mono_User (Gast)


Lesenswert?

aber cplib.so erzeug ich doch eigenltich mit dem config file 
cpdll.dll.config, leider funktioniert das anscheinend noch nicht 
richtig. deswegen meine frage ob ich das noch irgendwie aktivieren kann. 
nachdem was ich geleden habe müsste die cplib.so dann im gleichen 
verzeichniss wie das config file liegen. richtig?

von Mono_User (Gast)


Lesenswert?

habe gerade noch gesehen das er als warnung "Assembly System.Deployment 
not found" ausgibt. hat das vielleicht irgendetwas damit zu tun (dumme 
frage ich weiß). Wie kann ich die Warnung beheben???

von Markus V. (valvestino)


Lesenswert?

Warum steht im Deinem DllImport "cplib" und nicht "cplib.dll" oder 
"cplib.so"?

Gruß
Markus

von Mono_User (Gast)


Lesenswert?

habe auch cplib.so probiert bringt aber den gleichen fehler, da die 
datei nicht erstellt wird. dürfte aber keinen unterschied machen ob 
cplib oder cplib.so
siehe:
http://monodevelop.com/Documentation

von U.R. Schmitt (Gast)


Lesenswert?

Zitat Wikipedia:
"Mono bietet mit der aktuellen Version 2.0 die Kompatibilität mit den 
nicht-windowsspezifischen Bibliotheken von .NET 2.0. Anwendungen, die 
auf .NET 3.0, .NET 3.5 oder .NET 4.0 basieren, sind somit derzeit unter 
Mono nicht lauffähig. Des weiteren ist der Zugriff auf 
windowsspezifische Funktionalitäten mittels P-Invoke oder COM Interop, 
d. h. die Verwendung von Bibliotheken, die nicht in IL-Code, sondern in 
normalem, prozessorspezifischen Assemblercode vorliegen, nicht 
gestattet. Zwar kann auch Mono auf Bibliotheken zugreifen, die in C oder 
C++ geschrieben sind, allerdings sind die meisten dieser Bibliotheken 
plattformabhängig."

Das hast Du hoffentlich berücksichtigt.

ist die DLL von Dir?
Hast Du alle notwendigen Sourcen?
Kannst Du die shared lib analog zur DLL auf windows bauen? Man nuss dem 
Linker meines Wissens mitteilen, daß das target eine shared lib werden 
soll.
Wenn das alles funktioniert, ich bin zwar kein Unix Crack, aber 
normalerweise muss der LD_LIBRARY_PATH auf das Verzeichnis der Lib 
zeigen.

von Markus V. (valvestino)


Lesenswert?

Folgendes kommt mit merkwürdig vor:

1. Du bildest den Namen cpdll.dll auf den Namen cpdll.so ab. Woher soll 
die .net-Runtime wissen, dass Du mit "cpdll" "cpdll.dll" meinst? Klar, 
könnte man jetzt argumentieren, das ".dll" wird automatisch angehängt, 
aber unter Linux??

2. I.d.R. nutzt Dir das Config-File cpdll.dll.config nichts. 
Konfigurationseinstellungen werden üblicherweise im File App.config oder 
<programmName>.exe.config (Windows) im Ordner der Anwendung abgelegt. 
Unter Linux dürfte das dann <programmName>.config sein. Willst du eine 
andere Konfigurationsdatei verwenden, mußt Du das selbst 
ausprogrammieren.

Vielleicht schaust Du nochmal in der Mono-Doku nach.

Gruß
Markus

von Mono_User (Gast)


Lesenswert?

U.R. Schmitt schrieb:
> ist die DLL von Dir?
ja selbst erstellt
> Hast Du alle notwendigen Sourcen?
was brauche ich außer der dll
> Kannst Du die shared lib analog zur DLL auf windows bauen? Man nuss dem
> Linker meines Wissens mitteilen, daß das target eine shared lib werden
> soll.
lib wird in windows auch erzeugt

Markus Volz schrieb:
> 1. Du bildest den Namen cpdll.dll auf den Namen cpdll.so ab. Woher soll
> die .net-Runtime wissen, dass Du mit "cpdll" "cpdll.dll" meinst? Klar,
> könnte man jetzt argumentieren, das ".dll" wird automatisch angehängt,
> aber unter Linux??

da kann ich dir jetzt nicht folgen, baue doch die config folgendermaßen 
auf:
<configuration>
<dllmap dll="cpdll.dll" target="./cplib.so"/>
</configuration>

Habe das aus folgender Anleitung entnommen:
http://www.mono-project.com/Config_DllMap

Dachte ich hab gelesen das config File muss sich auf die zu bearbeitende 
Datei beziehen. Habs ber gerade auch mit <programmName>.config versucht. 
Geht auch nicht :-(

von Mono_User (Gast)


Lesenswert?

Habe die stelle wieder gefunden:
http://www.mono-project.com/Config

To configure assemblies, you create a file with the extension .config 
containing the configuration elements that you want for your assembly. 
For example, if you want to configure the program "hello.exe" you would 
create a "hello.exe.config" file. This is not limited to executables, 
you can also configure libraries, for example "library.dll" and 
"library.dll.config".

von bluppdidupp (Gast)


Lesenswert?

Nur nochmal zur Sicherheit: Das ist nur ein Mapping! D.h. eine auf dem 
Zielsystem lauffähige cplib.so musst du dir schon selbst 
besorgen/kompilieren und dort verfügbar machen!

von Markus V. (valvestino)


Lesenswert?

Ok, dann arbeitet die Mono-Runtime hier anders als das Windows-Pendant.

Was aber bleibt: Du hast im DllImport-Attribut den DLL-Namen mit "cplib" 
angegeben, im Config-File mapst Du aber "cpdll.dll" auf "./cplib.so"! 
Wie soll das zusammen passen???? "cplib" ist nicht gleich mit 
"cpdll.dll", oder wie siehst Du das?

Schreibe im DllImport-Attribut "cpdll.dll" oder im Config-File anstelle 
von "cpdll.dll" "cplib".

Gruß
Markus

von Mono_User (Gast)


Lesenswert?

bluppdidupp schrieb:
> eine auf dem
> Zielsystem lauffähige cplib.so musst du dir schon selbst
> besorgen/kompilieren und dort verfügbar machen!

was meinst du mit besorgen, ich ging bis jetzt davon aus das der Befehl 
im config file bedeutet: aus der dll datei wird die *.so datei erstellt 
die ich dann verwenden kann

von Mono_User (Gast)


Lesenswert?

Markus Volz schrieb:
> Was aber bleibt: Du hast im DllImport-Attribut den DLL-Namen mit "cplib"
> angegeben, im Config-File mapst Du aber "cpdll.dll" auf "./cplib.so"!
> Wie soll das zusammen passen???? "cplib" ist nicht gleich mit
> "cpdll.dll", oder wie siehst Du das?
>
> Schreibe im DllImport-Attribut "cpdll.dll" oder im Config-File anstelle
> von "cpdll.dll" "cplib".

jetzt blick ich gar nicht mehr durch, ich kann doch in linux keine dll 
dateien verwenden. Deswegen möchte ich aus der cpdll.dll die Datei 
cplib.so erstellen die ich dann verwenden kann.
Hab ich da einen großen Denkfehler drin oder reden wird nur aneinander 
vorbei.

von bluppdidupp (Gast)


Lesenswert?

Das funktioniert so nicht, mono kann keine "native"-dlls (d.h. normale 
dlls) konvertieren!

dllmap ist nur dafür gedacht, damit mono weiss dass es z.B. ne 
"libjpeg.so" laden kann wenn im Quelltext bei pinvoke z.B. "libjpeg.dll" 
angegeben wurde.

von U.R. Schmitt (Gast)


Lesenswert?

Mono_User schrieb:
> jetzt blick ich gar nicht mehr durch, ich kann doch in linux keine dll
> dateien verwenden. Deswegen möchte ich aus der cpdll.dll die Datei
> cplib.so erstellen die ich dann verwenden kann.
> Hab ich da einen großen Denkfehler drin oder reden wird nur aneinander
> vorbei.

Ich kenn zwar kein Mono und auch keine .net Programmierung, aber etwas 
Grundlagen tun auch im .net und C# Zeitalter gut!
Du kannst nicht eine ausführbare Windows dll auf ein Unix System packen 
und Schwups macht die Zauberumgebung daraus eine lauffähiges Unix shared 
object.
Das shared object muss aus den SOURCEN für das System gebaut und gelinkt 
werden und zwar mit den richtigen Optionen, oder du brauchst ein 
passendes für das entsprechende System.
Es schadet nie auch mal mit C oder C++ und einem Kommandozeilencompiler 
und separatem Linker etwas zu spielen um herauszufinden was wirklich 
passiert bis man ein ausführbares Programm erhält :-)
Viel Spass noch

von Mono_User (Gast)


Lesenswert?

Ok dann hab ich mir das zu einfach vorgestellt.schade eigentlich ;-).
Das heißt ich less mich jetzt mal in linux libs ein und versuch dann 
eine linux lib (.so) zu basteln. Quellcode der windows dll hab ich ja. 
Dann versuch ich mal mein glück.
vielen dank an alle für die aufklärungsarbeit was libs und linux 
betrifft.

von Arc N. (arc)


Lesenswert?

Mono_User schrieb:
> Ok dann hab ich mir das zu einfach vorgestellt.schade eigentlich ;-).
> Das heißt ich less mich jetzt mal in linux libs ein und versuch dann
> eine linux lib (.so) zu basteln. Quellcode der windows dll hab ich ja.
> Dann versuch ich mal mein glück.
> vielen dank an alle für die aufklärungsarbeit was libs und linux
> betrifft.

Eigentlich ganz einfach:
Managed DLLs können direkt verwandt werden  (aufpassen mit den Namen 
http://stackoverflow.com/questions/1160722/using-precompiled-net-assembly-dll-in-mono), 
native (s.o. P/Invoke) nicht (falls es was passendes gibt, kann man es 
mit einem Mapping versuchen s.o.).

von Mono_User (Gast)


Lesenswert?

Arc Net schrieb:
> Managed DLLs können direkt verwandt werden  (aufpassen mit den Namen
> http://stackoverflow.com/questions/1160722/using-p...),
> native (s.o. P/Invoke) nicht (falls es was passendes gibt, kann man es
> mit einem Mapping versuchen s.o.).

Was heißt denn das, was sind managed dlls und was native. Unter was 
fällt meine selbst erstellte dll datei. ich habe die dll eingentlich nur 
benutzt um c code in c# verwenden zu können.

von Arc N. (arc)


Lesenswert?

Mono_User schrieb:
> Arc Net schrieb:
>> Managed DLLs können direkt verwandt werden  (aufpassen mit den Namen
>> http://stackoverflow.com/questions/1160722/using-p...),
>> native (s.o. P/Invoke) nicht (falls es was passendes gibt, kann man es
>> mit einem Mapping versuchen s.o.).
>
> Was heißt denn das, was sind managed dlls und was native. Unter was
> fällt meine selbst erstellte dll datei. ich habe die dll eingentlich nur
> benutzt um c code in c# verwenden zu können.

Die mit C# selbst erstellte DLL ist managed/CIL Code. Falls diese jetzt 
auf eine weitere, native WIN32-DLL zugreifen soll braucht man unter 
Linux/Mono das oben angesprochenen Mapping auf ein dort vorhandenes SO 
(Shared Object).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.