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
Wenn's keine cplib.so gibt, kannst du die auch nicht importieren. Also besorg' dir erst mal cplib.so für Linux.
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???
Warum steht im Deinem DllImport "cplib" und nicht "cplib.dll" oder "cplib.so"? Gruß Markus
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.