Bagikan melalui


Cara: Mendeklarasikan Handel dalam Jenis Asli

Anda tidak dapat mendeklarasikan tipe handel dalam tipe asli. vcclr.h menyediakan templat gcroot pembungkus jenis aman untuk merujuk ke objek CLR dari timbunan C++. Templat ini memungkinkan Anda menyematkan handel virtual dalam jenis asli dan memperlakukannya seolah-olah itu adalah jenis yang mendasar. Dalam kebanyakan kasus, Anda dapat menggunakan gcroot objek sebagai jenis tersemat tanpa transmisi apa pun. Namun, dengan untuk masing-masing, di, Anda harus menggunakan static_cast untuk mengambil referensi terkelola yang mendasar.

gcroot Templat diimplementasikan menggunakan fasilitas kelas nilai System::Runtime::InteropServices::GCHandle, yang menyediakan "handles" ke dalam tumpukan yang dikumpulkan sampah. Perhatikan bahwa handel itu sendiri bukan sampah yang dikumpulkan dan dibebaskan ketika tidak lagi digunakan oleh destruktor di gcroot kelas (destruktor ini tidak dapat dipanggil secara manual). Jika Anda membuat gcroot instans objek pada tumpukan asli, Anda harus memanggil hapus pada sumber daya tersebut.

Runtime akan mempertahankan hubungan antara handel dan objek CLR, yang dirujuknya. Ketika objek CLR bergerak dengan tumpukan yang dikumpulkan sampah, handel akan mengembalikan alamat baru objek. Variabel tidak harus disematkan sebelum ditetapkan ke gcroot templat.

Contoh

Sampel ini menunjukkan cara membuat gcroot objek pada tumpukan asli.

// mcpp_gcroot.cpp
// compile with: /clr
#include <vcclr.h>
using namespace System;

class CppClass {
public:
   gcroot<String^> str;   // can use str as if it were String^
   CppClass() {}
};

int main() {
   CppClass c;
   c.str = gcnew String("hello");
   Console::WriteLine( c.str );   // no cast required
}
hello

Sampel ini menunjukkan cara membuat gcroot objek pada timbunan asli.

// mcpp_gcroot_2.cpp
// compile with: /clr
// compile with: /clr
#include <vcclr.h>
using namespace System;

struct CppClass {
   gcroot<String ^> * str;
   CppClass() : str(new gcroot<String ^>) {}

   ~CppClass() { delete str; }

};

int main() {
   CppClass c;
   *c.str = gcnew String("hello");
   Console::WriteLine( *c.str );
}
hello

Sampel ini menunjukkan cara menggunakan gcroot untuk menyimpan referensi ke jenis nilai (bukan jenis referensi) dalam jenis asli dengan menggunakan gcroot pada jenis kotak.

// mcpp_gcroot_3.cpp
// compile with: /clr
#include < vcclr.h >
using namespace System;

public value struct V {
   String^ str;
};

class Native {
public:
   gcroot< V^ > v_handle;
};

int main() {
   Native native;
   V v;
   native.v_handle = v;
   native.v_handle->str = "Hello";
   Console::WriteLine("String in V: {0}", native.v_handle->str);
}
String in V: Hello

Baca juga

Menggunakan interop C++ (PInvoke implisit)