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, 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 , 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 |
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 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 S
nested_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_Equality
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 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.
İ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.
Uygulamanızda başvuruda bulunan derlemelerin zaman damgasını denetleyin.
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.
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_ACCESS
yeniden derlechangeaccess.cpp
. Yöntemini protected
, yerine public
yaparaccess_me
, bu nedenle dışarıdan Test
veya türevlerinden çağrılmaz. yeniden derlemeden referencing.exe
uygulamayı 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