Aracılığıyla paylaş


Yerel Türlerde İşleyiciler Nasıl Bildirilir

Yerel türde işleyici bildiremezsiniz.vcclr.h C++ yığınından CLR nesnesine başvurmak için gcroot tür kullanımı uyumlu sarmalayıcı şablonunu sağlar.Bu şablon sanal bir işleyiciyi yerel türe katıştırmanıza ve o türe temeldeki türmüş gibi davranmanıza izin verir.Çoğu durumda, gcroot nesnesini herhangi bir atama olmadan katıştırılmış nesne olarak kullanabilirsiniz.Ancak, Her, içinde, temeldeki yönetilen başvuruyu almak için static_cast'i kullanmalısınız.

gcroot şablonu, atık toplanan yığına işleyiciler sağlayan System::Runtime::InteropServices::GCHandle değer sınıfının özellikleri kullanılarak uygulanır.Unutmayın ki işleyicilerin kendileri atık olarak toplanmamıştır ve artık kullanılmadıklarında gcroot sınıfındaki yıkıcı (bu yıkıcı el ile çağrılamaz) tarafından serbest bırakılır.Yerel yığında bir gcroot nesnesi örneği oluşturursanız, o kaynakta silme çağırmalısınız.

Çalışma zamanı işleyici ile başvurduğu CLR nesnesi arasında bir ilişkilendirme sürdürür.CLR nesnesi atık olarak toplanmış yığınla birlikte taşındığında, işleyici nesnenin yeni adresini döndürür.Bir değişken gcroot şablonuna atanmadan önce sabitlenmiş olmak zorunda değildir.

Örnek

Bu örnek yerel yığında gcroot nesnesinin nasıl oluşturulacağını göstermektedir.

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

Bu örnek yerel yığında gcroot nesnesinin nasıl oluşturulacağını göstermektedir.

// 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 );
}
  

Bu örnek kutulanmış türde gcroot kullanarak yerel türdeki değer türlerine (başvuru türleri değil) başvuruları tutmak için gcroot'un nasıl kullanılacağını göstermektedir.

// 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);
}
  

Ayrıca bkz.

Başvuru

C++ Birlikte Çalışabilirliği Kullanma (Dolaylı Olarak PInvoke)