Aracılığıyla paylaş


Yönetilen Türler (C++/CLI)

Visual C++, ortak dil çalışma zamanının özellikleri için destek sağlayan ve çalışma zamanının avantajlarına ve kısıtlamalarına tabi olan yönetilen türler aracılığıyla .NET özelliklerine erişim sağlar.

Yönetilen Türler ve ana İşlev

kullanarak /clr bir uygulama yazdığınızda, main() işlevinin bağımsız değişkenleri yönetilen bir tür olamaz.

Düzgün bir imza örneği:

// managed_types_and_main.cpp
// compile with: /clr
int main(int, char*[], char*[]) {}

.NET Framework C++ Yerel Türlerine Eşdeğer

Aşağıdaki tabloda, Sistem ad alanında önceden tanımlanmış türlerin diğer adları olan yerleşik Visual C++ türleri için anahtar sözcükler gösterilmektedir.

Visual C++ türü .NET Framework türü
void System.Void
bool System.Boolean
signed char System.SByte
unsigned char System.Byte
wchar_t System.Char
short ve signed short System.Int16
unsigned short System.UInt16
int, signed int, long ve signed long System.Int32
unsigned int ve unsigned long System.UInt32
__int64 ve signed __int64 System.Int64
unsigned __int64 System.UInt64
float System.Single
double ve long double System.Double

Derleyici seçeneğinin signed char veya unsigned char olarak varsayılan ayarına ilişkin daha fazla bilgi almak için /J'a bakın (Varsayılan char türü unsigned'dir).

Yerel Türlerde İç İçe Yerleştirilmiş Değer Türleri için Sürüm Sorunları

İstemci derlemesi oluşturmak için kullanılan imzalı (tanımlayıcı ad) derleme bileşenini düşünün. Bileşen, istemcide yerel bir birleşim, sınıf veya dizi üyesinin türü olarak kullanılan bir değer türü içerir. Bileşenin gelecekteki bir sürümü değer türünün boyutunu veya düzenini değiştirirse, istemcinin yeniden derlenmiş olması gerekir.

sn.exe ile bir anahtar dosyası oluşturun.

Örnek

Aşağıdaki örnek bileşendir.

// nested_value_types.cpp
// compile with: /clr /LD
using namespace System::Reflection;
[assembly:AssemblyVersion("1.0.0.*"),
assembly:AssemblyKeyFile("mykey.snk")];

public value struct S {
   int i;
   void Test() {
      System::Console::WriteLine("S.i = {0}", i);
   }
};

Bu örnek, istemcidir:

// nested_value_types_2.cpp
// compile with: /clr
#using <nested_value_types.dll>

struct S2 {
   S MyS1, MyS2;
};

int main() {
   S2 MyS2a, MyS2b;
   MyS2a.MyS1.i = 5;
   MyS2a.MyS2.i = 6;
   MyS2b.MyS1.i = 10;
   MyS2b.MyS2.i = 11;

   MyS2a.MyS1.Test();
   MyS2a.MyS2.Test();
   MyS2b.MyS1.Test();
   MyS2b.MyS2.Test();
}

Örnek şu çıkışı oluşturur:

S.i = 5
S.i = 6
S.i = 10
S.i = 11

Açıklamalar

Ancak, nested_value_types.cpp içinde, örneğin double d; gibi başka bir üye struct S eklerseniz ve istemciyi yeniden derlemeden bileşeni yeniden derlerseniz, sonuç System.IO.FileLoadException türünde işlenmeyen bir özel durum olur.

Eşitliği test etme yöntemi

Aşağıdaki örnekte, C++ için Yönetilen Uzantılar kullanan bir eşitlik testi, tanıtıcıların işaret ettiği şeyleri temel alır.

Örnek

// mcppv2_equality_test.cpp
// compile with: /clr /LD
using namespace System;

bool Test1() {
   String ^ str1 = "test";
   String ^ str2 = "test";
   return (str1 == str2);
}

Bu programın IL'i, dönüş değerinin op_Equality çağrısı kullanılarak uygulandığını gösterir.

IL_0012:  call       bool [mscorlib]System.String::op_Equality(string, string)

Derleme uyumluluk sorunlarını tanılama ve düzeltme

Derleme zamanında başvuruda bulunılan derlemenin sürümü çalışma zamanında başvuruda bulunılan derleme sürümüyle eşleşmediğinde, çeşitli sorunlar oluşabilir.

Derleme yapıldığında, #using sözdizimi kullanılarak diğer derlemelere başvurulabilir. Derleme sırasında bu derlemelere derleyici tarafından erişilir. İyileştirme kararları almak için bu derlemelerden alınan bilgiler kullanılır.

Ancak başvurulan bileşen değiştirilir ve yeniden derlenirse, bundan bağımlı olan başvuru yapan bileşeni de yeniden derleyin. Aksi takdirde, derlemeler uyumsuz hale gelebilir. İlk başta geçerli olan iyileştirme kararları yeni derleme sürümü için doğru olmayabilir. Bu uyumsuzluklar nedeniyle çeşitli çalışma zamanı hataları oluşabilir. Böyle durumlarda belirli bir istisna üretilmez. Hatanın çalışma zamanında raporlanma şekli, soruna neden olan kod değişikliğinin niteliğine bağlıdır.

Uygulamanızın tamamı ürününüzün yayımlanan sürümü için yeniden oluşturulduysa, bu hatalar son üretim kodunuzda sorun oluşturmamalıdır. Genel kullanıma sunulan derlemeler, bu sorunların önlenmesini sağlayacak resmi bir sürüm numarasıyla işaretlenmelidir. Daha fazla bilgi için Derleme Sürümü Yönetimi kısmına bakın.

Uyumsuzluk hatasını tanılamak ve düzeltmek için

Başka bir derlemeye başvuran kodda çalışma zamanı istisnaları veya diğer hata koşullarıyla karşılaşmanız muhtemeldir. Başka bir nedeni belirleyemiyorsanız, sorun güncel olmayan bir montaj olabilir.

  1. İlk olarak, özel durumu veya diğer hata koşulunu yalıtın ve yeniden oluşturun. Eski bir özel durum nedeniyle oluşan bir sorun yeniden üretilebilir olmalıdır.

  2. Uygulamanızda referans aldığınız derlemelerin zaman damgasını denetleyin.

  3. Atıfta bulunulan derlemelerin zaman damgaları, uygulamanızın son derlemesinin zaman damgasından sonraysa, uygulamanız güncel olmayabilir. Güncel değilse uygulamanızı en son derlemelerle yeniden derleyin ve gerekirse kodunuzu düzenleyin.

  4. Uygulamayı yeniden çalıştırın, sorunu yeniden oluşturan adımları gerçekleştirin ve özel durumun oluşmadığını doğrulayın.

Örnek

Aşağıdaki program sorunu gösterir: önce bir yöntemin erişilebilirliğini azaltır ve sonra yeniden derlemeden başka bir derlemede bu yönteme erişmeye çalışır. Önce derleyin changeaccess.cpp . Değiştirilecek olan başvurulan derlemedir. Ardından derleyin referencing.cpp. Başarıyla derlenmelidir. Ardından, çağrılan yöntemin erişilebilirliğini azaltın. derleyici seçeneğiyle changeaccess.cppyeniden derle/DCHANGE_ACCESS. access_me yöntemini public yerine protected yapar, bu nedenle Test veya türevlerinden dışarıdan çağrılamaz. yeniden derlemeden referencing.exeuygulamayı yeniden çalıştırın. bir MethodAccessException oluşur.

// changeaccess.cpp
// compile with: /clr:safe /LD
// After the initial compilation, add /DCHANGE_ACCESS and rerun
// referencing.exe to introduce an error at runtime. To correct
// the problem, recompile referencing.exe

public ref class Test {
#if defined(CHANGE_ACCESS)
protected:
#else
public:
#endif

  int access_me() {
    return 0;
  }

};

Referans derlemesi için kaynak:

// referencing.cpp
// compile with: /clr:safe
#using <changeaccess.dll>

// Force the function to be inline, to override the compiler's own
// algorithm.
__forceinline
int CallMethod(Test^ t) {
  // The call is allowed only if access_me is declared public
  return t->access_me();
}

int main() {
  Test^ t = gcnew Test();
  try
  {
    CallMethod(t);
    System::Console::WriteLine("No exception.");
  }
  catch (System::Exception ^ e)
  {
    System::Console::WriteLine("Exception!");
  }
  return 0;
}

Ayrıca bkz.

C++/CLI ile .NET programlama (Visual C++)
Diğer .NET dilleri ile birlikte çalışabilirlik (C++/CLI)
Yönetilen türler (C++/CLI)
#using Yönergesi