ERLEDIGT
NEIN
NEIN
ANTWORTEN
4
4
ZUGRIFFE
19280
19280
EMPFEHLEN
-
22.09.06 09:18 #1
- Registriert seit
- Jun 2005
- Beiträge
- 48
Hallo,
ich versuch mal gleich auf den Punkt zu kommen.
Ich benutze für C(++) die GNU Compiler gcc bzw g++, die cygwin mir mitliefert.
Dabei benutze ich die Option -mno-cygwin. Habe gelesen, dass es damit quasi die mingw-Tools wären. Aber hauptsächlich möchte ich unabhängig von der cygwin1.dll sein.
Für C# benutze ich Visual Studio C# .NET 2003.
Ich habe einige Funktionen in C gebaut (einfache Funktionen ohne Klassen), die aber C++ Objekte benutzen.
Daraus habe ich mit der -shared Option von g++ eine DLL gebaut.
Beispielcode:
Ich benutze nicht ausschließlich C++ (also nur Klassen), da ein Teil des Codes (von Lex) generiert werden wird und der spuckt soweit ich weiß immer C aus.Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14
class testclass { public: testclass() {} int tf() { return 42; } }; int testfkt() { testclass *tc = new testclass(); int r = tc->tf(); delete tc; return r; }
Meine Aufrufe waren also
g++ -mno-cygwin -c testlib.cpp
g++ -mno-cygwin -shared -o testlib.dll testlib.o
Diese Funktion möchte ich nun in einer C# Klasse verwenden.
Dafür habe ich eine weitere C# Klasse gebaut.
Aufruf ist dann einfachCode :1 2 3 4 5 6 7
using System.Runtime.InteropServices; public class ValueWrapper { [DllImport("testlib.dll")] public static extern int testfkt(); }
int i = ValueWrapper.testfkt();
Wenn ich die Funktion aufrufe kommt der Fehler "Einstiegspunkt testfkt nicht gefunden".
Seh ich auch ein und daher habe ich im Netz danach gesucht, wie man einen Einstiegspunkt definiert.
Habe gelesen, dass der Einstiegspunkt immer main() ist. Umbenennung der Funktion testfkt hat aber nicht geholfen.
Ich habe auch "__declspec( dllexport )" vor die Funktion geschrieben. Ohne Ergebnis.
Hab gelesen, dass ich eine Export-Liste in ein DEF-File schreiben muss. Aber ich hab auch gelesen, dass die Option -shared sowieso alles exportiert.
Besonders viele Beispiele habe ich zum Einbinden der DLL in C# gefunden. Aber ich konnte kein klares Beispiel finden, das mir sagt, wie die die C(++)-Quellen dazu aussehen müssen.
Es ist nicht so, dass ich zu dem Thema nichts finde. Eher finde ich zu viel und ich kenn mich mit DLLs zu wenig aus, als dass ich jetzt alleine entscheiden kann, was von all dem ich genau tun muss.
Daher der Thread hier.
Ich hoffe, ihr könnt mir - kompetent wie immer - helfen.
-
22.09.06 12:07 #2
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Also selbst hab ich das auch noch nicht ausprobiert, aber es scheint so das du nicht darum kommst für deine unmanaged C++ DLL einen Wrapper in managed C++ zu schreiben.
Schau mal hier: http://www.codeguru.com/cpp/cpp/cpp_...cle.php/c6867/
Das Problem mit GCC ist allerdings das das ABI vermutlich unterschiedlich ist und andere Symbole für die Klassenmethoden und Funktionsnamen (name mangling) generiert werden. Du müßtest allerdings Funktionen aufrufen können die als C Funktionen in deiner DLL implementiert sind. (extern "C")
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
01.03.08 23:56 #3
- Registriert seit
- Mar 2006
- Beiträge
- 256
Hallo und wie geht es umgekehrt? Eine C# dll in eine C++ dll einbinden?
-
Öhm ....
also DLL steht ja für Dynamic-Link-Library ... Somit ist es unabhängig womit die dll geschrieben ist, da es sowieso alles in die opcodes bzw. den maschinen code übersetzt wird. Was zu tun ist:
a) Dynamisch die dll laden
b) Statisch (mit header-Dateien, etc ...)
MfGwe change the future and the future changes us!
.:: a new hope ::.
-
Das ist für die Verwendung der DLL nicht relevant, da du ja nur die exportierten Funktionen verwendest. Beim Laden der DLL wird nätürlich irgendwo ein "main()" erwartet, aber das ist ein anderes Thema.
Richtig sollte die Funktion so implementiert werden (extern "C" hatte deepthroat schon genannt):
Ein DEF-File halte ich für sehr empfehlenswert, weil man damit sicherstellen kann das der dort angegebene Funktionsname exportiert wird.Code cpp:1 2 3 4
extern "C" __declspec(dllexport) int testfkt() { }
Ich bin mir nicht sicher ob's überhaupt geht und wenn, dann wohl nur mit exorbitanten Aufwand.
Kann man leider so pauschal nicht sagen. Die Extension "DLL" wird für Komponenten mit vollkommen unterschiedlicher Ausprägung verwendet:
(1) Reguläre DLLs: Das sind die, die du meinst, also Komponenten, die einen Satz von Funktionen exportieren.
(2) COM-DLLs: COM steht für Component Object Model. Diese DLLs stellen entsprechende Interfaces bereit, für deren Import eine spezielle Programmtechnik erforderlich ist.
(3) .NET-Klassenbibliotken: Diese DLLs lassen sich meines Wissens nur in .NET-Projektstrukturen verwenden und sind wieder vollkommen anderes aufgebaut, als die vorherigen beiden.
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
Ähnliche Themen
-
.bpl und .dll in .exe einbinden
Von Asix im Forum Borland CBuilder und VCLAntworten: 5Letzter Beitrag: 11.01.09, 12:14 -
.as einbinden
Von EGJSoldier im Forum Flash PlattformAntworten: 7Letzter Beitrag: 15.12.08, 09:37 -
DLL einbinden?
Von chriss_2oo4 im Forum C/C++Antworten: 1Letzter Beitrag: 15.12.07, 09:24 -
DLL Einbinden?
Von lordfritte im Forum C/C++Antworten: 8Letzter Beitrag: 22.07.07, 19:22 -
LMO in PHP-Kit einbinden
Von Teaser im Forum PHPAntworten: 0Letzter Beitrag: 31.05.04, 11:44





Zitieren

Login






