tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
19280
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    mueslirocker mueslirocker ist offline Mitglied Bronze
    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:
    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;
    }
    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.
    Code :
    1
    2
    3
    4
    5
    6
    7
    
    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.
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.

  3. #3
    lordfritte lordfritte ist offline Mitglied Brokat
    Registriert seit
    Mar 2006
    Beiträge
    256
    Hallo und wie geht es umgekehrt? Eine C# dll in eine C++ dll einbinden?
     

  4. #4
    Avatar von anhadikal
    anhadikal anhadikal ist offline Mitglied Bronze
    Registriert seit
    Jun 2007
    Beiträge
    45
    Ö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
     
    we change the future and the future changes us!
    .:: a new hope ::.

  5. #5
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Zitat Zitat von mueslirocker Beitrag anzeigen
    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.
    Zitat Zitat von mueslirocker Beitrag anzeigen
    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):
    Code cpp:
    1
    2
    3
    4
    
    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.
    Zitat Zitat von lordfritte Beitrag anzeigen
    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.
    Zitat Zitat von anhadikal Beitrag anzeigen
    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
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

Ähnliche Themen

  1. .bpl und .dll in .exe einbinden
    Von Asix im Forum Borland CBuilder und VCL
    Antworten: 5
    Letzter Beitrag: 11.01.09, 12:14
  2. .as einbinden
    Von EGJSoldier im Forum Flash Plattform
    Antworten: 7
    Letzter Beitrag: 15.12.08, 09:37
  3. DLL einbinden?
    Von chriss_2oo4 im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 15.12.07, 09:24
  4. DLL Einbinden?
    Von lordfritte im Forum C/C++
    Antworten: 8
    Letzter Beitrag: 22.07.07, 19:22
  5. LMO in PHP-Kit einbinden
    Von Teaser im Forum PHP
    Antworten: 0
    Letzter Beitrag: 31.05.04, 11:44