# C(++) DLL in C# einbinden



## mueslirocker (22. September 2006)

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:

```
class testclass
{
  public:
    testclass() {}
    int tf() { return 42; }
};

int testfkt()
{
    testclass *tc = new testclass();
	int r = tc->tf();
	delete tc;
    return r;
}
```
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.

```
using System.Runtime.InteropServices;

public class ValueWrapper
{
	[DllImport("testlib.dll")]
	public static extern int testfkt();
}
```
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.


----------



## deepthroat (22. September 2006)

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_managed/interop/article.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ß


----------



## lordfritte (1. März 2008)

Hallo und wie geht es umgekehrt? Eine C# dll in eine C++ dll einbinden?


----------



## anhadikal (2. März 2008)

Ö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 ...)

MfG


----------



## MCoder (2. März 2008)

mueslirocker hat gesagt.:


> Habe gelesen, dass der Einstiegspunkt immer main() ist.


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.


mueslirocker hat gesagt.:


> Ich habe auch "__declspec( dllexport )" vor die Funktion geschrieben. Ohne Ergebnis.
> Hab gelesen, dass ich eine Export-Liste in ein DEF-File schreiben muss.


Richtig sollte die Funktion so implementiert werden (extern  "C" hatte deepthroat schon genannt):

```
extern "C" __declspec(dllexport) int testfkt()
{

}
```
Ein DEF-File halte ich für sehr empfehlenswert, weil man damit sicherstellen kann das der dort angegebene Funktionsname exportiert wird.


lordfritte hat gesagt.:


> Hallo und wie geht es umgekehrt? Eine C# dll in eine C++ dll einbinden?


Ich bin mir nicht sicher ob's überhaupt geht und wenn, dann wohl nur mit exorbitanten Aufwand.


anhadikal hat gesagt.:


> 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.


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


----------

