dll stack übergeben



  • Guten Abend,
    wenn ich in C++ eine dll erstelle mit dem Rückgabewert eines Stacks und ich diese dl in C# einbinde bekomme ich folgenden Fehler:

    "return value" kann nicht gemarshallt werden: Generische Typen können nicht gemarshallt werden..

    Ich bin für jede Hilfe dankbar, wie ich mein Problem dennoch realisieren kann.
    Danke, und einen netten Gruß ^^



  • Zeig mal Definition in C++ sowie Aufruf in C#.



  • Hallo 🙂
    Zunächst der Import der dll im C# Programm:

    class Class1
        {
            [DllImport("myfirstdll.dll")]
            public static extern Stack<string> SomeFunction(char a);
    
            public Stack<string> Test12(char a)
            {
                return SomeFunction(a);
    
            }
    
        }
    

    Jetzt die dll:
    main.h:

    #ifndef __MAIN_H__
    #define __MAIN_H__
    
    #include <windows.h>
    #include <stack>
    
    /*  To use this exported function of dll, include this header
     *  in your project.
     */
    
    #ifdef BUILD_DLL
        #define DLL_EXPORT __declspec(dllexport)
    #else
        #define DLL_EXPORT __declspec(dllimport)
    #endif
    
    #ifdef __cplusplus
    extern "C"
    {
    #endif
    
    std::stack<char*> DLL_EXPORT SomeFunction(char a);
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif // __MAIN_H__
    

    main.cpp

    #include "main.h"
    
    // a sample exported function
    std::stack<char*> DLL_EXPORT SomeFunction(char a)
    {
       // std::stack<std::string> folder;
        std::stack<char*> data;
    
        data.push("hi");
        data.push("a12");
    
        //MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
        return data;
    }
    
    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
    {
        switch (fdwReason)
        {
            case DLL_PROCESS_ATTACH:
                // attach to process
                // return FALSE to fail DLL load
                break;
    
            case DLL_PROCESS_DETACH:
                // detach from process
                break;
    
            case DLL_THREAD_ATTACH:
                // attach to thread
                break;
    
            case DLL_THREAD_DETACH:
                // detach from thread
                break;
        }
        return TRUE; // succesful
    }
    

    Wenn ich in C# den Rückgabewert als string deklariere und in der dll mit char* funktioniert es, nur mit dem Stack nicht.

    Vielen Dank für eure Hilfe 🙂



  • Oh, oh...

    Du vermischst die verschiedensten Datentypen.

    Wenn du mittels 'extern "C"' von C++ aus eine Funktion exportierst, so sollten diese nur native C-Datentypen (PODs) enthalten - std::stack<char> ist dagegen ein C++-Datentyp (Klasse).

    Zum anderen ist ein C#-Stack ganz anders intern organisiert als der gleichnamige C++-Datentyp.

    Bei (const) char* und string (C#) klappt es, da dort ein automatisches Marshalling stattfindet (dagegen könntest du NICHT den C++-Datentypen std::string damit benutzen!).

    Du mußt also deine DLL-Schnittstelle so umbauen, daß sie nur auf reine C-Datentypen aufsetzt, d.h. du wirst mehrere Funktionen anbieten müssen.
    (evtl. würde es klappen, wenn du ein C-Array anbietest - damit habe ich aber bisher keine Erfahrung).


Anmelden zum Antworten