Aracılığıyla paylaş


Nasıl yapılır: Yerel Türlerde İşleyicileri Bildirme

Yerel türde tanıtıcı türü bildiremezsiniz. vcclr.h, C++ yığınından bir CLR nesnesine başvurmak için tür açısından güvenli sarmalayıcı şablonunu gcroot sağlar. Bu şablon, bir sanal tanıtıcıyı yerel bir türe eklemenizi ve temel alınan tür gibi işlemenizi sağlar. Çoğu durumda, nesneyi herhangi bir atama olmadan katıştırılmış tür olarak kullanabilirsiniz gcroot . Bununla birlikte , içindeki her birinde, temel alınan yönetilen başvuruyu almak için kullanmanız static_cast gerekir.

Şablon gcroot , atık toplanan yığına "tanıtıcılar" sağlayan System::Runtime::InteropServices::GCHandle değer sınıfının özellikleri kullanılarak uygulanır. Tanıtıcıların kendilerinin çöp toplanmadığını ve sınıftaki yıkıcı gcroot tarafından artık kullanılmadığında serbest olduğunu unutmayın (bu yıkıcı el ile çağrılamaz). Yerel yığında bir gcroot nesne örneği oluşturursanız, bu kaynakta delete öğesini çağırmanız gerekir.

Çalışma zamanı tanıtıcı ile başvurduğu CLR nesnesi arasında bir ilişki tutar. CLR nesnesi çöp toplanan yığınla birlikte hareket ettiğinde, tanıtıcı nesnenin yeni adresini döndürür. Bir değişkenin şablona gcroot atanmadan önce sabitlenmiş olması gerekmez.

Örnekler

Bu örnek, yerel yığında bir nesnenin nasıl oluşturulacağını gcroot gösterir.

// 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

Bu örnek, yerel yığında bir gcroot nesnenin nasıl oluşturulacağını gösterir.

// 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

Bu örnek, kutulu türü kullanarak yerel bir türdeki gcroot değer türlerine (başvuru türlerine değil) başvuruları tutmak için nasıl kullanılacağını gcroot gösterir.

// 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

Ayrıca bkz.

C++ Birlikte Çalışabilirliği Kullanma (Örtük PInvoke)