Wieso kann Unmanaged VC++ .NET Bibliotheken laden

  • C++

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Wieso kann Unmanaged VC++ .NET Bibliotheken laden

    Hallo,

    ich entwickle auf der Arbeit derzeit eine native C++ Applikation, hasse es aber mich mit MFC rumzuschlagen. Es ist einfach nur krampfig, deshalb habe ich gestern zuhause ein paar Tests gemacht.
    Ich habe eine WPF Custom Control Library (.NET) erstellt in der ich eine statische Methode habe und mit einem Plugin [DllExport] fähig ist. Somit hat die .NET Library eine Export Methode, welche eine WPF Form aufruft.

    Dann bin ich in C++ hingegangen und habe mit LoadLibrary eben genau diese .NET Library geladen.
    Nun bin ich etwas verwundert wieso das funktioniert, denn laut MSDN:

    ​If the specified module is a DLL that is not already loaded for the calling process, the system calls the DLL's DllMain function with the DLL_PROCESS_ATTACH value. If DllMain returns TRUE, LoadLibrary returns a handle to the module. If DllMain returns FALSE, the system unloads the DLL from the process address space andLoadLibrary returns NULL.
    (Quelle: msdn.microsoft.com/en-us/libra…op/ms684175(v=vs.85).aspx)

    Wieso also, da die .NET Library keine DllMain Methode hat, liefert mir LoadLibrary ein gültiges Handle und nicht NULL?

    Gibt es den DllMain Einstiegspunkt bei .NET Libraries wirklich? Wenn ja, kann ich den selbst auch benutzen, sodass ich direkt Aktionen ausführen kann wenn die Bibliothek geladen wird?
    Dann bräuchte ich nämlich keine Exports sondern kann den GUI Kram von WPF erledigen und mittels unsafe die paar Eigenschaften die ich bearbeiten will direkt patchen.

    Das alles funktioniert bisher super: Methode wird exportiert: Mittels LoadLibrary lade ich die Dll in C++, hab mir ein typedef gemacht welche die Signatur der Methode beschreibt, habe mit GetProcAddress den Export Address besorgt und kann die Methode einfach aufrufen. (Die Methode hat einen Pointer Parameter zu einer Options-Klasse).

    In meiner C# Methode die dann aufgerufen wird, kann ich mit unsafe und dem Pointer zur Options-Klasse die Struktur nachbilden und dort weiterarbeiten.

    Ich würde nur gern den technischen Hintergrund besser verstehen, wieso unmanaged c++, managed .NET bibiliotheken laden kann.

    Grüße
    Diese Möglichkeit besteht gerade wegen der von dir gewollten Interopabilität.
    Soweit ich das verstanden habe bedeutet dies, solange du nicht angibst, dass deine DLL rein unmanaged sein soll und nicht von nativem Code aufgerufen werden kann wird DllMain erzeugt, was eben alles vorbereitet um die unmanaged Library aus dem nativen Kontext laden zu können und auch Funktionspointer zu initialisieren anschließend werden bei entsprechender Verwendung noch cctor aufgerufen(static konstruktor). Falls diesselbe Library aber aus einem unmanaged Kontext geladen wird, so wird die DllMain ignoriert und es wird direkt der unmanaged initalisierungsvorgang in Gang gebracht.

    Also wenn du etwas zu beginn initialisieren möchtest, dann verwende einen static konstruktor. DllMain ist sowieso böse^^

    Abgesehen davon macht mir dein Vorhaben angst und schreie deshalb laut: Nein Bitte tu das nicht.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @jvbsl Wir hatten mal ein riesiges C++-Projekt (MFC), das sollte mehrsprachig gemacht werden.
    Da haben wir auch sukzessiv GUI-Teile in eine CLI-DLL ausgelagert und mit Managed C++ das Problem gelöst.
    Etwas tricky, aber funktional.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Warum nicht einfach ein gescheites UI Framework verwenden, statt irgendein CrossCall Monster zu schreiben?
    Denn wenn man die Möglichkeit hat .Net zu verwenden, dann spricht bestimmt auch nichts dagegen GTK oder QT zu verwenden. Abgesehen davon, dass man mit QT noch viele andere geschickte sachen mit bekommt...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    statt irgendein CrossCall Monster zu schreiben
    Das wurde von der Administration so vorgegeben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Mir kommt es so vor als gibt es in den Firmen einfach viel zu viele Leute die entweder 19hundert vorm Krieg programmieren gelernt haben oder einfach überhaupt nie richtig programmieren gelernt haben und dann nimmt man halt etwas was funktioniert egal, dass es eigt. mehr Aufwand als nötig ist, unperformanter, schlechter les und wartbar....Ich meine man kann nicht immer die schlechteste aller Lösungen nehmen, aber irgendwie schaffen es die meisten Firmen trotzdem immer wieder^^
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---