Cara: Struktur Marshal Menggunakan Interop C++
Topik ini menunjukkan satu faset interoperabilitas Visual C++. Untuk informasi selengkapnya, lihat Menggunakan Interop C++ (PInvoke Implisit).
Contoh kode berikut menggunakan arahan #pragma terkelola dan tidak dikelola untuk mengimplementasikan fungsi terkelola dan tidak terkelola dalam file yang sama, tetapi fungsi-fungsi ini beroperasi dengan cara yang sama jika ditentukan dalam file terpisah. File yang hanya berisi fungsi yang tidak dikelola tidak perlu dikompilasi dengan /clr (Kompilasi Runtime Bahasa Umum).
Contoh: Meneruskan struktur dari fungsi terkelola ke tidak terkelola
Contoh berikut menunjukkan meneruskan struktur dari yang dikelola ke fungsi yang tidak dikelola, baik berdasarkan nilai maupun berdasarkan referensi. Karena struktur dalam contoh ini hanya berisi jenis data intrinsik sederhana (lihat Jenis Blittable dan Non-Blittable), tidak diperlukan marshaling khusus. Untuk membuat marshal struktur yang tidak dapat di-blittable, seperti struktur yang berisi pointer, lihat Cara: Marshal Embedded Pointers Menggunakan Interop C++.
// 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);
}
Contoh: Meneruskan struktur dari tidak dikelola ke fungsi terkelola
Contoh berikut menunjukkan meneruskan struktur dari yang tidak dikelola ke fungsi terkelola, baik berdasarkan nilai maupun berdasarkan referensi. Karena struktur dalam contoh ini hanya berisi jenis data intrinsik sederhana (lihat Jenis Blittable dan Non-Blittable), tidak diperlukan marshalling khusus. Untuk membuat marshal struktur yang tidak dapat di-blittable, seperti struktur yang berisi pointer, lihat Cara: Marshal Embedded Pointers Menggunakan Interop C++.
// 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();
}