2010-12-06 19 views
2

Ich versuche, eine DLL zur Arbeit zu bekommen.Marshalling C++ int * zu C#

Die DLL ist in C++ geschrieben und muss int * an C# übergeben. Ich verbrachte einige Tage damit, das zu arbeiten, und es scheitert. Ich fange an, mir die Haare auszuziehen, weil ich nicht herausfinden kann, was falsch ist. Ich habe alles versucht. Ich bin nicht so vertraut mit C++ wie ich mit C# bin, so könnte Problem von dort kommen ...

Es liest sich gut aus der DLL, aber die zurückgegebenen Werte sind nicht korrekt. Ich habe die Eingänge entfernt, und ich versuche nur, ein Test-Array durchzubekommen. Die Funktion, die ich in C++ verwende ist:

extern "C" EAGLE128DLL_API int* encryptFunc() 
{ 
    //return encrypt(x, Q); 

    int t[128]; 

    for(int i = 0; i < 128; i++) 
    { 
     t[i] = 5; 
    } 

    return t; 
}; 

Der C# -Code Ich benutze diese Funktion aufzurufen, ist wie folgt:

[DllImport("C:\\Users\\Leon\\Documents\\Visual Studio 2010\\Projects\\Eagle128DLL\\Release\\Eagle128DLL.dll")] 
      public static extern IntPtr encryptFunc(); 
    ... 

IntPtr outputPtr = encryptFunc(); 
int[] output = new int[128]; 

Marshal.Copy(outputPtr, output, 0, 128); 

Die Werte innerhalb Ausgabegruppe sollte alle 5s sein. Aber was ich bekomme ist: 16187392, 16190224 .. etc (nicht 5)

+0

Sie sollten auch in der Lage sein, das [return: MarshalAs] -Attribut zu verwenden, um int [] anstelle von IntPtr zurückzugeben und den Marshall die Arbeit für Sie erledigen zu lassen: [return: MarshalAs (UnmanagedType.LPArray, SizeConst = 128) ] public static extern int [] encryptFunc(); – jeffora

Antwort

2

Der C++ - Code enthält einen Fehler: Sie geben einen Zeiger auf eine Variable im Stack (t[128] ist nur eine temporäre Variable), die nicht funktioniert. Sobald Ihre encryptFunc zurückgibt, werden die call stack will be unwound und die Variable t[128] verworfen.

Wenn Ihr Code muss nicht sicher einspringenden oder Gewinde werden, können Sie einfach machen t[128] statisch:

static int t[128]; 
... 
return t; 

Eine statische Variable wird nicht mehr auf dem Stapel gespeichert und das Ende der Funktion überleben .

+0

haha ​​kann nicht glauben, dass es so einfach war. Die größten Haarreife sind immer so einfach, dass man nicht einmal daran denkt ... Vielen Dank !! – Leon

+0

Ich nehme an, ich sollte ein Löschen [] auf statischen Arrays verwenden, um sie aus dem Speicher zu entfernen, wenn sie einmal fertig sind? – Leon

+0

Nein, tu das nicht. Verwenden Sie delete [] nur für Speicher, der auf dem Heap zugeordnet wurde (mit new). Sie sollten statische Variablen nicht löschen müssen. –

2

Ich denke, dass Ihr Problem ist, dass Sie versuchen, einen Wert, der lokal auf dem Stapel in Ihrer C-Funktion deklariert wurde.

Die beste Sache ist, ein vorher zugewiesenes Array an Ihre C-Funktion zu übergeben, die die Daten erhält, die die Funktion erstellt und sie an den Aufrufer zurückgibt.