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
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?
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???
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
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.
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
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 :-(
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".
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!
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
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
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.
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.
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
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.
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.).
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.
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).