Unmanaged C++ Code in C# Anwendung benutzen



  • Hallo.
    Ich habe eine Konsolenanwendung in C++ geschrieben und möchte nun in C# eine GUI dafür programmieren. Doch wie kann ich am besten meinen C++ Code (Klassen) in einer C# Anwendung einbinden?



  • Servus,

    du kannst z.B. aus dem unmanaged eine Dll basteln und diese dann verwenden:

    http://www.thecodeproject.com/csharp/unmanage.asp
    http://www.csharphelp.com/archives/archive52.html
    http://www.csharphelp.com/archives/archive63.html

    so machs ich immer....

    *winke*
    Hellsgore



  • Täusche ich mich, oder wird da nur beschrieben wie man das mit reinen Funktionen macht?

    Aber wie geht das wenn ich eine ganze Klasse einbinden möchte?



  • Es gibt dort keine Klassen. Konventionelle DLLs enthalten immer nur C-Funktionen. Wenn du eine DLL mit Klassen willst, brauchst du ne managed DLL.



  • Und kann ich in eine managed Dll unmanaged C++ Klassen reinschreiben?+



  • Ich kann dazu jetzt leider kein Statement abgeben, weil ich nicht wirklich der managed-unmanaged-Mischmeister bin, aber zumindest habe ich noch nie gehört, dass so etwas gehen soll.
    Ich kenne es eigentlich nur so, dass in managed DLLs CIL-Klassen stehen und in herkömmlichen DLLs wie seit Jahrzehnten eben C-Funktionen.



  • COM ist das zauberwort



  • Sorry wenn ich das sage, aber COM ist ******** zu programmieren 👎 . Aber Recht hast du natürlich schon. Vielleicht lässt sich aber auch was mit Managed C++ machen. Genau aus diesen Gründen habe ich sehr früh von C# auf C++ gewechselt. Wer das nicht gemacht hat muss nu damit leben 😋 .



  • Sorry wenn ich das sage, aber COM ist ******** zu programmieren

    per hande ja, aber dazu hat MS so ein schönes ding names ATL gebastelt 😉



  • Na gut, daran hab ich jetzt gerade nicht gedacht. Aber für die Verwendung aus C# greift man vielleicht doch besser zu managed C++, da es eher auf Zusammenarbeit mit .Net ausgelegt ist als ATL (obwohl es via Interop natürlich mit beidem funktioniert)...



  • Optimizer schrieb:

    Es gibt dort keine Klassen. Konventionelle DLLs enthalten immer nur C-Funktionen. Wenn du eine DLL mit Klassen willst, brauchst du ne managed DLL.

    Was ist das dann wenn man eine Klasse mit __declspec(export) exportiert? Die ist dann sehr wohl in der DLL. Nicht nur die einzelnen Funktionen der Klasse sind dann von außen zugänglich, sondern die Klasse als ganzes (auch inklusive der Variablen). Habe ich schon oft gemacht und funktioniert einwandfrei. Oder habe ich da was übersehen?

    Eine Klasse in .NET zu wrappen ist kein Problem: Einfach alle Funktionen der Klasse in einer (neuen) managed Klasse noch einmal nachbauen und den Aufruf an eine Instanz der unmanaged Klasse weiterleiten (wobei die Instanz der unmanaged Klasse im Konstruktor/Destruktor erzeugt/gelöscht wird). Wichtig ist nur eines: msvcrt.lib linken! Ohne die Bibliothek kennt er die unmanaged-Operatoren new und delete nicht mehr.

    mfg



  • Was ist das dann wenn man eine Klasse mit __declspec(export) exportiert?

    Dann kommt was raus, nicht dokmentiert ist. Klasse exportieren kannst du wenn du die application/dll mit einem compiler/linker und in der selben sprache erstellt, alles andere ist reiner zufall wenns es funktioniert



  • Du kannst zwar deine Klassen per __declspec(export) von C++ nach C++ exportieren, nach C# bzw. .NET geht es nicht, da der C++ Standard keine einheitliches Format für den Export von Klassen vorsieht. Mit anderen Worten: jeder Compilerhersteller speichert die Klassen für Dlls (auch statische Libs) in einem anderen Format ab. Es wäre ziemlich aufwändig alle (zum Teil) proprietären Compilerformate zu unterstützen. Ist eher ein C++ Problem als ein .NET Problem.



  • Allso ich habs geschafft.
    Die Klassen mit __declspec(dllexport) in ne dll exportieren.
    Dann eine managed C++ Wrapper Klasse schreiben.
    Die kann man dan in C# einbinden.


Anmelden zum Antworten