unmanaged dll in managed c++



  • Hallo
    ich hab hier hunderte von unmanaged dlls, die aus einer früheren version meines projektes stammen, da es aber zu viel eit kosten würde alles neu zu schreiben, möchte ich jetzt einige dll in mein neues projekt mit managed c++ einbinden.
    die alten dlls stammen aus einem programm mit mfc.
    jetzt würde ich gern wissen, ob und wie ich des anstellen kann, oder nach was ich suchen muss.
    Gruß KY



  • Hi! Das stichwort hier lautet P-Invoke.
    Damit kannst du unmanaged code in eine .Net Assembly einbinden.

    Hier mal eben ein Beispiel, wie man man eine C++ Funktion in ein C#
    Projekt einbindet. Unter C++.Net sollte das ja ähnlich funktionieren.

    [DllImport("xxx.dll", EntryPoint = "?FuncName@@YAHPAN0HN0@Z")]
    	    private static extern int FuncName(
                double[] Xs,
                double[] Ys,
    		    int npts,
    		    double X,
    		    ref double Y);
    

    mfg Tom



  • danke sieht gut aus.
    brauch ich den entrypoint, wenn ja wie finde ich den raus?
    weil ohne kommt bei mir die meldung:
    Error 1 error C3749: 'System::Runtime::InteropServices::DllImportAttribute': a custom attribute may not be used inside a function .\Main.cpp 32

    Vielen Dank



  • brauch ich den entrypoint, wenn ja wie finde ich den raus?

    Den brauchst Du nur wenn der "managed" Funktionsname vom "unmanaged" Funktionsname abweicht. (Im Bsp. tut er das, weil der Funktionsname C++ mangled ist.)

    Edit: Herausfinden kannst Du die Funktionsname / Entrypoints mit dem Dependency Walker.

    Error 1 error C3749: 'System::Runtime::InteropServices::DllImportAttribute': a custom attribute may not be used inside a function .\Main.cpp 32

    Ich denke Du hast versucht die Funktionsdeklaration in einer Funktion anzulegen.
    Probiers mal in einer Klasse.

    Simon



  • Vielen Dank des hilft mir schon mal en stück weiter

    Ich denke Du hast versucht die Funktionsdeklaration in einer Funktion anzulegen.
    Probiers mal in einer Klasse

    Stimmt genau.
    hab den Code einfach mal irgendwo reingetan
    ------------
    Jetzt hab ich leider des Problem das er die dll nicht findet.
    Wo muss die dll liegen? (Debug/Release-Ordner?)

    An unhandled exception of type 'System.DllNotFoundException' occurred in M3_VersionLinks_managed.exe
    
    Additional information: Unable to load DLL 'm3_globalsd.dll': Das angegebene Modul wurde nicht gefunden. (Exception from HRESULT: 0x8007007E)
    

    Vielen dank Gruß KY



  • Jetzt hab ich leider des Problem das er die dll nicht findet.
    Wo muss die dll liegen? (Debug/Release-Ordner?)

    Genau. Debug / Release Order ist ok.
    Allgemein gesagt muss sie im working directory sein. Das ist normalerweise dort wo dein executable liegt.

    Abhilfe zum Testen würden heir absolute Pfade schaffen.

    Grüss
    Seimon



  • in denen Ordnern hatte ich die dll schon drin aber es kamm trotzdem diese meldung
    hab auch den namen schon überprüft...

    Was meinst mit absoluten Pfaden?
    Gruß KY



  • ich hab grad gesehn:

    'M3_VersionLinks_managed.exe': Loaded 'Debug\m3_globalsd.dll', Symbols loaded.
    'M3_VersionLinks_managed.exe': Unloaded 'Debug\m3_globalsd.dll'
    A first chance exception of type 'System.DllNotFoundException' occurred in M3_VersionLinks_managed.exe
    An unhandled exception of type 'System.DllNotFoundException' occurred in M3_VersionLinks_managed.exe

    warum wird die dll "Unloaded" ?
    liegt das vll daran, das er die nicht findet?



  • also hab den fehler gefunden!
    es lag daran, dass meine dll die ich einbinden wollte noch mehr dlls benötigt hat und ich diese nicht im verzeichniss liegen hatte.
    Vielen Dank Gruß KY


Log in to reply