방법: C++ Interop를 사용하여 구조체 마샬링
이 항목에서는 Visual C++ 상호 운용성의 한 가지 측면을 보여 줍니다. 자세한 내용은 C++ Interop 사용(암시적 PInvoke)을 참조하세요.
다음 코드 예제에서는 관리되는 관리되지 않는 #pragma 지시문을 사용하여 동일한 파일에서 관리되는 함수와 관리되지 않는 함수를 구현하지만, 이러한 함수는 별도의 파일에 정의된 경우 동일한 방식으로 상호 운용됩니다. 관리되지 않는 함수만 포함하는 파일은 /clr(공용 언어 런타임 컴파일)을 사용하여 컴파일할 필요가 없습니다.
예: 관리되는 함수에서 관리되지 않는 함수로 구조 전달
다음 예제에서는 관리되는 함수에서 관리되지 않는 함수로 구조체를 값과 참조로 전달하는 방법을 보여 줍니다. 이 예제의 구조에는 단순하고 내장적인 데이터 형식만 포함되므로(Blittable 및 Blittable이 아닌 형식 참조) 특수 마샬링이 필요하지 않습니다. 포인터가 포함된 구조체와 같이 Blittable이 아닌 구조를 마샬링하려면 방법: 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);
}
예: 관리되지 않는 함수에서 관리되는 함수로 구조체 전달
다음 예제에서는 값과 참조를 통해 관리되지 않는 함수에서 관리되는 함수로 구조를 전달하는 방법을 보여 줍니다. 이 예제의 구조에는 간단한 내장 데이터 형식만 포함되므로(Blittable 및 Blittable이 아닌 형식 참조) 특별한 마샬링이 필요하지 않습니다. 포인터가 포함된 구조체와 같이 Blittable이 아닌 구조를 마샬링하려면 방법: 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();
}