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).