Gewusst wie: Marshallen von Strukturen mit C++-Interop

In diesem Thema wird ein Facet der Visual C++-Interoperabilität veranschaulicht. Weitere Informationen finden Sie unter Using C++ Interop (Implicit PInvoke).

In den folgenden Codebeispielen werden die verwalteten, nicht verwalteten #pragma Direktiven verwendet, um verwaltete und nicht verwaltete Funktionen in derselben Datei zu implementieren, diese Funktionen funktionieren jedoch in gleicher Weise, wenn sie in separaten Dateien definiert sind. Dateien, die nur nicht verwaltete Funktionen enthalten, müssen nicht mit /clr (Common Language Runtime Compilation) kompiliert werden.

Beispiel: Übergeben der Struktur von verwalteter zu nicht verwalteter Funktion

Im folgenden Beispiel wird die Übergabe einer Struktur von einer verwalteten funktion an eine nicht verwaltete Funktion sowohl nach Wert als auch nach Verweis veranschaulicht. Da die Struktur in diesem Beispiel nur einfache, systeminterne Datentypen enthält (siehe Blittable- und Nicht-Blittable-Typen), ist keine spezielle Marshalling erforderlich. Informationen zum Marshal non-blittable strukturen, z. B. solche, die Zeiger enthalten, finden Sie unter How to: Marshal Embedded Pointers Using C++ Interop.

// PassStruct1.cpp
// compile with: /clr

#include <stdio.h>
#include <math.h>

using namespace System;
using namespace System::Runtime::InteropServices;

#pragma unmanaged

struct Location {
   int x;
   int y;
};

double GetDistance(Location loc1, Location loc2) {
   printf_s("[unmanaged] loc1(%d,%d)", loc1.x, loc1.y);
   printf_s(" loc2(%d,%d)\n", loc2.x, loc2.y);

   double h = loc1.x - loc2.x;
   double v = loc1.y - loc2.y;
   double dist = sqrt( pow(h,2) + pow(v,2) );

   return dist;
}

void InitLocation(Location* lp) {
   printf_s("[unmanaged] Initializing location...\n");
   lp->x = 50;
   lp->y = 50;
}

#pragma managed

int main() {
   Location loc1;
   loc1.x = 0;
   loc1.y = 0;

   Location loc2;
   loc2.x = 100;
   loc2.y = 100;

   double dist = GetDistance(loc1, loc2);
   Console::WriteLine("[managed] distance = {0}", dist);

   Location loc3;
   InitLocation(&loc3);
   Console::WriteLine("[managed] x={0} y={1}", loc3.x, loc3.y);
}

Beispiel: Übergeben der Struktur von nicht verwalteter Funktion an verwaltete Funktion

Im folgenden Beispiel wird die Übergabe einer Struktur von einer nicht verwalteten Funktion an eine verwaltete Funktion sowohl nach Wert als auch nach Verweis veranschaulicht. Da die Struktur in diesem Beispiel nur einfache, systeminterne Datentypen enthält (siehe Blittable- und Nicht-Blittable-Typen), ist keine spezielle Marshalling erforderlich. Informationen zum Marshal non-blittable strukturen, z. B. solche, die Zeiger enthalten, finden Sie unter How to: Marshal Embedded Pointers Using C++ Interop.

// PassStruct2.cpp
// compile with: /clr
#include <stdio.h>
#include <math.h>
using namespace System;

// native structure definition
struct Location {
   int x;
   int y;
};

#pragma managed

double GetDistance(Location loc1, Location loc2) {
   Console::Write("[managed] got loc1({0},{1})", loc1.x, loc1.y);
   Console::WriteLine(" loc2({0},{1})", loc2.x, loc2.y);

   double h = loc1.x - loc2.x;
   double v = loc1.y = loc2.y;
   double dist = sqrt( pow(h,2) + pow(v,2) );

   return dist;
}

void InitLocation(Location* lp) {
   Console::WriteLine("[managed] Initializing location...");
   lp->x = 50;
   lp->y = 50;
}

#pragma unmanaged

int UnmanagedFunc() {
   Location loc1;
   loc1.x = 0;
   loc1.y = 0;

   Location loc2;
   loc2.x = 100;
   loc2.y = 100;

   printf_s("(unmanaged) loc1=(%d,%d)", loc1.x, loc1.y);
   printf_s(" loc2=(%d,%d)\n", loc2.x, loc2.y);

   double dist = GetDistance(loc1, loc2);
   printf_s("[unmanaged] distance = %f\n", dist);

   Location loc3;
   InitLocation(&loc3);
   printf_s("[unmanaged] got x=%d y=%d\n", loc3.x, loc3.y);

    return 0;
}

#pragma managed

int main() {
   UnmanagedFunc();
}

Siehe auch

Verwenden von C++-Interop (implizites PInvoke)