2016-08-04 32 views
1

Ich habe eine Funktion in C++ geschrieben, die ich in eine DLL einfügen und in C# mit DllImport verwenden. Funktioniert alles; Ich bin in der Lage, den Rückgabewert von C++ zu erhalten und es in meinem C# GUI anzuzeigen. Jetzt möchte ich zu dieser Funktion hinzufügen und es mehrere Werte zurückgeben (3 bisher). Ich habe die Methoden versucht, die in Return C++ array to C# und How to return two different variable in c++? gegeben werden, aber keiner funktioniert. Der Code aus dem ersten Post gibt mir einen Zugriffsverletzungsfehler und der Code aus dem zweiten gibt mir alle 0 Werte für die Struktur. Für den ersten kopierte ich sogar den gegebenen Code genau und versuchte, ihn auszuführen, aber ohne Erfolg. Was könnte die Fehler und falschen Werte verursachen, die durch diese Methoden gegeben werden? Wie kann ich sie zur Arbeit bringen?Rückgabe von Arrays und Strukturen aus einer C++ Funktion in C#

Nur für den Fall, dass es erforderlich ist, ist mein eigener Code mit der Umsetzung der zweiten Post unten.

bisection.h

struct Result 
{ 
    double root; 
    double relError; 
    double absError; 
}result; 
extern "C" {__declspec(dllexport) Result bisection(double l, double u, double stoppingError, int maxIter); } 

bisection.cpp

Result bisection(double l, double u, double stoppingError, int maxIter) { 
//code for this function 
result.root = xr; 
result.relError = e; 
result.absError = 1;  
return result; 
} 

C# -Code

[StructLayout(LayoutKind.Sequential)] 
    public struct Result 
    { 
     public double root; 
     public double relError; 
     public double absError;    
    } 
    [DllImport(dllPath)] 
    private static extern Result bisection(double l, double u, double stoppingError, int maxIter); 

Result result = bisection(data[0], data[1], 0.1, 100); 
+0

Ihr Header hat 'Bisection' und gibt ein' double' zurück, während die Implementierung ein 'Result' zurückgibt. – PaulMcKenzie

+0

Ah! Ein Fehler, als ich meinen Code bearbeitet habe, um ihn hier zu posten. Ich habe es behoben. – Aeleon

+0

Vielleicht wäre es besser, das Ergebnis als out-Parameter zu übergeben, anstatt es zurückzugeben, und den C++ - Code mit dem 'Result' zu füllen. Dies würde im Modell folgen, wie Sie Windows-API-Funktionen aufrufen, die "eine Struktur zurückgeben müssen" (wie "GetMessage") – PaulMcKenzie

Antwort

1

Ihr Code ist fast richtig. Die Aufrufkonvention stimmt nicht überein. Der C++ - Code verwendet Cdecl, den C# -Standruf. Ändere eins, so dass sie übereinstimmen.

+0

Ja, das war es; Das ist es, was es getan hat. Ich kopiere den Code aus ein paar Online-Quellen und ich habe es während meiner Bearbeitung vermasselt, um meine Bedürfnisse zu erfüllen. Ich lese auf die Aufrufkonvention und die Standardeinstellung es stdcall; Sobald ich das geändert hatte, funktionierte der Code gemäß Ihren Anweisungen. Vielen Dank – Aeleon