Frage

Ich habe eine Drittanbietersammlung von .H -Dateien zusammen mit den .lib -Dateien, die mit ihnen entstehen. Ich wickle diese nativen C ++ - Dateien mit einem C ++/CLI -Wrapper ein und tätige endgültige Anrufe von C#. Ich habe ein Problem, wenn ich Methoden aufrufe, die erwarten, dass eine Referenz in die Übergabe des Wertes in meiner Wrapper wird, es sei denn, ich ändere sie explizit.

Mein C ++/CLI -Wrapper -Code sieht derzeit so aus:

bool get_testInt16(int16% testInt16)
{
   int16* t = static_cast<int16*>(GCHandle::ToIntPtr(GCHandle::Alloc(testInt16)).ToPointer());
   bool b = m_NativeCMTY_TestData->get_testInt16(*t);
   testInt16 = *t;
   return b;
};

Und der entsprechende native C ++ - Code sieht aus wie:

bool get_testInt16(int16 &testInt16);

Ich denke, es muss einen besseren Weg geben, aber vielleicht nicht? Sagen Sie einfach, ich hoffe, es gibt einen besseren Weg!

War es hilfreich?

Lösung

Eine Option wäre zu tun:

bool get_testInt16(int16% testInt16)
{
   int16 t = testInt16;
   bool b = m_NativeCMTY_TestData->get_testInt16(t);
   testInt16 = t;
   return b;
};

Sie erstellen also einfach eine lokale native Variable und vermeiden das riesige Zeigerguss und das .NET -Zeiger.

Andere Tipps

Jeder Grund, warum Sie keine Pinning -Zeiger anstelle von verwenden GCHandle::ToIntPtr(GCHandle::Alloc(testInt16)).ToPointer()?

Auch der referenzierte Wert wie diesen ist zu spät.

Wenn die Referenz auf einen Stapelwert ist, ist sie nicht benötigt, wenn es sich um eine Referenz auf ein Instanzfeld handelt, sollte der aufrufende Code das Objekt wirklich festigen die Methode klar.

Da der REF -Parameter so klein ist, wäre es sinnvoll, einfach das gesamte Pinning vollständig zu vermeiden und eine vorübergehende auf dem Stapel zu erstellen, diese an die nicht verwaltete Funktion zu übergeben und ihn dann wieder an das Original zu schreiben.

bool get_testInt16(int16% testInt16)
{
   int16 temp = testInt16;
   bool b = m_NativeCMTY_TestData->get_testInt16(temp);
   testInt16 = temp;
   return b;
};
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top