2 Stimmen

Rufe C++ Funktion in C# aus DLL auf - seltsame Parameter

Ich habe eine Funktion, die in C++ mit folgendem Header geschrieben ist:

void EncodeFromBufferIN(void* bufferIN, int bufferINSize, unsigned char*  &bufferOUT, int &bufferOUTSize);

Ich habe die .h- und .cpp-Dateien so bearbeitet, dass ich die Funktion durch das Importieren der DLL in C# aufrufen kann:

**EncodeFromBufferIN.h**
extern "C" {
     __declspec(dllexport) void EncodeFromBufferIN(void* bufferIN, int bufferINSize, unsigned char*  &bufferOUT, int &bufferOUTSize);
}
**EncodeFromBufferIN.cpp**
extern void EncodeFromBufferIN(void* bufferIN, int bufferINSize, unsigned char*  &bufferOUT, int &bufferOUTSize){
    // stuff to be done
}

Aber jetzt ist mein Problem, dass ich nicht weiß, wie ich die Funktion in C# aufrufen soll. Ich habe den folgenden Code in C# hinzugefügt, bin mir aber nicht sicher, wie ich die Parameter an die Funktion übergeben soll.

[DllImport("QASEncoder.dll")]
        unsafe public static extern void EncodeFromBufferIN(void* bufferIN, int bufferINSize, out char[] bufferOUT, out int bufferOUTSize);

Der bufferIN und bufferOUT sollten Strings sein, aber wenn ich die Funktion so aufrufe:

public string prepareJointsForQAS()
{
   string bufferIN = "0 0 0 0 0";
   char[] bufferOUT;
   int bufferOUTSize;
   EncodeFromBufferIN(bufferIN, bufferIN.Length, bufferOUT, bufferOUTSize);
}

Bekomme ich diesen Fehler: "Die besten überladenen Methoden für ... haben einige ungültige Argumente". Wie sollten also die Parameter übergeben werden?

5voto

renick Punkte 3868

Das Marshalling funktioniert am besten mit C-Style-Aufrufen. Daher ist es am besten, reines C für Ihre öffentliche Schnittstelle zu verwenden. Wenn es überhaupt möglich ist, den nativen Code zu ändern

void EncodeFromBufferIN(
    unsigned char* bufferIN, 
    int bufferINSize, 
    unsigned char* bufferOUT,     
    int* bufferOUTSize);

Dann kann der Aufruf in C# wie folgt aussehen

[DllImport("QASEncoder.dll")]
public static extern void EncodeFromBufferIN(
    String bufferIN, 
    int bufferINSize, 
    StringBuilder bufferOUT, 
    ref int bufferOUTSize);

String inStr = new String(255);
int inSize = 255;
// eine genaue Schätzung für die Ausgabegröße vornehmen 
// und in C# vorab zuweisen (ich schätze 255)
StringBuilder outStr = new StringBuilder(255);
int outSize = 255;

EncodeFromBufferIN(inStr, inSize, outStr, outSize);

Auf diese Weise können Sie Speicherzuweisungen im nicht verwalteten Code vermeiden, was (obwohl machbar) unübersichtlich werden kann.

Hoffentlich hilft Ihnen das weiter.

1voto

Omar Jarid Punkte 21

Ein paar Korrekturen, die für mich funktioniert haben:

        string inStr = "Zu übergebender Wert";
        int inSize = inStr.Length;
        StringBuilder outStr = new StringBuilder(255);
        int outSize = 255;

        EncodeFromBufferIN(inStr, inSize, outStr, ref outSize);

Mit freundlichen Grüßen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X