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 /clrbir uygulama yazdığınızda, işlevin main() bağımsız değişkenleri yönetilen türde 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, longve 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

varsayılan veya derleyici seçeneği hakkında daha fazla bilgi için signed char bkz/J. (Varsayılan char tür )unsigned.unsigned char

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 (sn -k mykey.snk ile bir keyfile oluşturun.

Örnek

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

// 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 içine başka bir üye struct Snested_value_types.cpp eklerseniz (örneğin, double d;) ve istemciyi yeniden derlemeden bileşeni yeniden derlerseniz, sonuç işlenmeyen bir özel durumdur (türünde System.IO.FileLoadException).

Eşitlik için test etme

Aşağıdaki örnekte, C++ için Yönetilen Uzantılar kullanan bir eşitlik testi, tanıtıcıların neye başvurduğunu 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 değeri, dönüş değerinin çağrısı kullanılarak uygulandığını op_Equalitygö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 derlendiğinde, söz dizimi ile diğer derlemelere #using 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.

Bununla birlikte, başvurulan derleme değiştirilir ve yeniden derlenmişse, buna bağımlı başvuru derlemesini de yeniden derle. 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. Bu gibi durumlarda belirli bir özel durum üretilmemiştir. 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 bkz . Derleme Sürümü Oluşturma.

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

Başka bir derlemeye başvuran kodda çalışma zamanı özel durumları veya diğer hata koşullarıyla karşılaşabilirsiniz. Başka bir nedeni belirleyemiyorsanız, sorun eski bir derleme 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 başvuruda bulunan derlemelerin zaman damgasını denetleyin.

  3. Başvuruda bulunan derlemelerin zaman damgaları, uygulamanızın son derlemesinin zaman damgasından sonraysa, uygulamanız güncel değildir. 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 . Bu, değiştirilecek başvuruda bulunılan 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 /DCHANGE_ACCESSyeniden derlechangeaccess.cpp. Yöntemini protected, yerine publicyaparaccess_me, bu nedenle dışarıdan Test veya türevlerinden çağrılmaz. 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;
  }

};

Başvuran derlemenin kaynağı aşağıdadır:

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