C++ object pointer aus c++ factory dll in c# nutzen



  • Hallo zusammen,

    ich habe eine c++ Dll die eine methode bereit stellt, die mir ein Pointer auf ein object liefert(kein COM). Sehr stark vereinfacht sieht die verwendung dieser dll in c++ so aus!

    #include DefinitionOfIMyInterfaceObject.h
    
    typedef IMyInterface* (*pfnMyObject)();
    
    void test()
    {
        pfnMyObject pGetObject;
        HMODULE hMod = LoadLibrary("MyCPlusPlus.dll");
        pGetObject = (pfnMyObject*)GetProcAddress(hMod,"GetObjectMethodName");
    
        IMyInterface* pObj = pGetObject();
        pObj->DoSomething();
    }
    

    Diese Dll möchte ich jetzt in c# verwenden.

    [DllImport("MyCPlusPlus.dll", EntryPoint = "GetObjectMethodName")]
                public static extern IntPtr getObjectInCSharp();
    

    Bis hier her funzt das auch....nach dem Aufruf der "getObjectInCSharp" methode habe ich einen IntPtr....
    soweit so gut...aber wie bekomme ich jetzt aus dem IntPtr meinen Klassenpointer?

    Klasseninterface nachbauen und dieses Interface anstelle des IntPtr beim Import setzen?

    Geht dieser Mechanismus überhaupt in c# zu adaptieren?

    Bei msdn habe ich nur Beispiele für strukturen gefunden und da waren es auch keine Pointer auf strukturen sondern Kopien die von den Methoden geliefert wurden.

    Kann jemand helfen?

    Gruß
    Sascha



  • Sascha schrieb:

    ich habe eine c++ Dll die eine methode bereit stellt, die mir ein Pointer auf ein object liefert(kein COM)...

    Bis hier her funzt das auch....nach dem Aufruf der "getObjectInCSharp" methode habe ich einen IntPtr....
    soweit so gut...aber wie bekomme ich jetzt aus dem IntPtr meinen Klassenpointer?

    Ich würde jetzt mal tippen: gar nicht.

    Wobei es nun 2 weitere Möglichkeiten gäbe: Entweder baust du die C++ DLL so um das sie ein C-Interface liefert, oder du schreibst einen C++/CLI-Wrapper für die Kommunikation zwischen C# und der C++ DLL (genau dafür ist C++/CLI gedacht).



  • Hi,
    danke für deine Antwort.

    Die Sourcen für die Dll habe ich leider nicht in der Hand 😞 , von daher wäre es der C++/CLI Wrapper...hatte aber eigentlich gehofft einen Wrapper umgehen zu können! 🙄

    Gruß
    Sascha


Anmelden zum Antworten