mueslirocker
Mitglied
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.
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 einfach
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.
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:
Code:
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.
Code:
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.

Ich hoffe, ihr könnt mir - kompetent wie immer - helfen.
