Nasıl yapılır: C++ Birlikte Çalışması Kullanarak Yapıları Sıralama
Bu konu başlığında Visual C++ birlikte çalışabilirliğinin bir özelliği gösterilmektedir. Daha fazla bilgi için bkz . C++ Birlikte Çalışma Kullanma (Örtük PInvoke).
Aşağıdaki kod örnekleri yönetilen ve yönetilmeyen işlevleri aynı dosyada uygulamak için yönetilen, yönetilmeyen #pragma yönergelerini kullanır, ancak bu işlevler ayrı dosyalarda tanımlanırsa aynı şekilde birlikte çalışır. Yalnızca yönetilmeyen işlevleri içeren dosyaların /clr (Ortak Dil Çalışma Zamanı Derlemesi) ile derlenmesi gerekmez.
Örnek: Yapıyı yönetilen işlevden yönetilmeyen işleve geçirme
Aşağıdaki örnek, yönetilen bir yapıdan yönetilmeyen bir işleve hem değere hem de başvuruya göre bir yapı geçirmeyi gösterir. Bu örnekteki yapı yalnızca basit, iç veri türleri içerdiğinden (bkz . Blittable ve Blittable Olmayan Türler), özel sıralama gerekmez. İşaretçiler içerenler gibi bölünebilir olmayan yapıları sıralamak için bkz . Nasıl yapılır: C++ Birlikte Çalışma Kullanarak Katıştırılmış İşaretçileri Sıralama.
// 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);
}
Örnek: Yapıyı yönetilmeyen işlevden yönetilen işleve geçirme
Aşağıdaki örnek, yönetilmeyen bir yapıdan yönetilen bir işleve hem değere hem de başvuruya göre bir yapı geçirmeyi gösterir. Bu örnekteki yapı yalnızca basit, iç veri türleri içerdiğinden (bkz . Blittable ve Blittable Olmayan Türler), özel bir sıralama gerekmez. İşaretçiler içerenler gibi bölünebilir olmayan yapıları sıralamak için bkz . Nasıl yapılır: C++ Birlikte Çalışma Kullanarak Katıştırılmış İşaretçileri Sıralama.
// 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();
}