www.mikrocontroller.net

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


Autor: Mono_User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Zwie Blum (zwieblum)
Datum:

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

Autor: Mono_User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Mono_User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Markus Volz (valvestino)
Datum:

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

Gruß
Markus

Autor: Mono_User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus Volz (valvestino)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mono_User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-(

Autor: Mono_User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: bluppdidupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Markus Volz (valvestino)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mono_User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mono_User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: bluppdidupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mono_User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht 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-p...), 
native (s.o. P/Invoke) nicht (falls es was passendes gibt, kann man es 
mit einem Mapping versuchen s.o.).

Autor: Mono_User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht 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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.