Saf ve doğrulanabilir kod (C++/ CLI)
.NET Programlama için, Visual C++ birbirinden farklı üç bileşen ve uygulamanın oluşturulmasını desteklemektedir: karışık, saf ve doğrulanabilir. Üçü de /CLR (ortak dil çalışma zamanı derleme) derleyici seçeneği aracılığıyla kullanılabilir.
Notlar
Doğrulanabilir derlemeler hakkında daha fazla bilgi için bkz.
Karma, saf ve doğrulanabilir özellik karşılaştırma (C++/ CLI)
sql Server ile doğrulanabilir montajlarý kullanarak (C++/ CLI)
Karışık (/clr)
Karışık derlemelerin (/clr ile derlenmiş) hem yönetilmeyen hem de yönetilen kısımlar içermesi, bunların.NET özelliklerini kullanmasını mümkün kılar, ancak yine de yönetilmeyen kod içerir. Bu, tüm projenin yeniden yazılması gerekmeksizin .NET özeliklerini kullanmak için güncellenen uygulamalara ve bileşenlere izin verir. Yönetilen ve yönetilmeyen kodu bu şekilde karıştırmak için Visual C++ kullanmaya C++ Birlikte Çalışabilirliği adı verilir. Daha fazla bilgi için, bkz. Karışık (Yerel ve Yönetilen) Derlemeler ve Yerel ve.NET Birlikte Çalışabilirliği.
Saf (/clr:pure)
Saf derlemeler (/clr:pure ile derlenen) yerel veya yönetilen veri türleri içerebilir ancak yalnızca yönetilen işlevler içerir. Karışık derlemeler gibi saf derlemeler de P/Invoke üzerinden yerel DLL'lerle interop'a izin verir (bkz. C++'ta Açık PInvoke Kullanma (DllImport Özniteliği)), ancak C++ Interop özellikleri kullanılamaz. Ayrıca, saf bir derlemedeki giriş noktaları __clrcall çağırma kuralını kullandığı için, saf derlemeler yerel işlevlerden aranabilir işlevleri dışarı aktaramaz.
/clr:pure faydaları
Daha İyi Performans: Saf yalnızca MSIL içerdiğinden, yerel işlevler yoktur, dolayısıyla yönetilen ve yönetilmeyen geçişler gerekli değildir. (P/Invoke aracılığıyla yapılan işlev çağrıları bu kuralın dışındadır.)
AppDomain Tanıma: Yönetilen işlevler ve CLR veri türleri, görünürlükleri ile erişilebilirliklerini etkileyen Application Domains içinde bulunur. Saf derlemeler etki alanının farkındadır (__declspec(AppDomain) her tür için uygulanır) yani diğer.NET bileşenlerinden bunların türlerine ve işlevselliğine erişmek daha kolay ve güvenlidir. Bunun sonucunda, saf derlemeler, karışık derlemelere kıyasla diğer .NET bileşenleriyle birlikte daha kolay çalışır.
Disksiz yükleme: Saf derlemeler bellek içine yüklenebilir ve hatta akabilir. Bu, .Net derlemelerini depolanmış yordamlar olarak kullanma açısından önemlidir. Bu da Windows yükleme mekanizmaları üzerindeki bir bağımlılık nedeniyle yürütme için disk üzerinde olması gereken karışık derlemelerden farklıdır.
Yansıma: Saf derlemeler tam yansıtma desteği sağladığından karışık yürütülebilir dosyaların yansıtılması mümkün değildir. Daha fazla bilgi için bkz. Yansıtma (C++/ CLI).
Ana Bilgisayar Denetlenebilirliği: Saf derlemeler yalnızca MSIL içerdiğinden, CLR barındıran uygulamalarda kullanıldığında ve varsayılan davranışını değiştirdiğinde karışık derlemelere göre daha tahmin edilebilir ve esnek davranırlar.
/clr:pure öğesinin kısıtlamaları
Bu bölüm /clr:pureöğesi tarafından şu anda desteklenmeyen özellikleri anlatmaktadır.
Saf derlemeler yönetilmeyen işlevler tarafından çağrılamaz. Bu yüzden saf derlemeler COM arabirimlerini uygulayamaz veya yerel geri çağırmalar oluşturamaz. Saf derlemeler __declspec(dllexport) veya.DEF dosyaları aracılığıyla işlevleri dışarı aktaramaz. Ayrıca, __clrcall kuralı ile bildirilen işlevler, __declspec(dllimport) aracılığıyla içeri aktarılamaz. Yerel bir modüldeki işlevler bir saf derlemeden çağrılabilir, ancak saf derlemeler yerli çağrılabilir işlevleri göstermez, bu nedenle bir saf derlemede gösterme işlevselliği karışık bir derlemedeki yönetilen işlevler aracılığıyla yapılmalıdır. Daha fazla bilgi için bkz. Nasıl yapılır: /clr için geçiş: saf (C++/ CLI).
ATL ve MFC kitaplıkları, Visual C++'de saf mod derlemesi tarafından desteklenmemektedir.
Saf . netmodule'ler Visual C++ bağlayıcısına giriş olarak kabul edilmez. Ancak, saf .obj dosyaları bağlayıcı tarafından kabul edilir ve .obj dosyaları netmodules içinde yer alan bilgilerin bir üst kümesini içerirler. Daha fazla bilgi için bkz. dosyaları bağlayıcı olarak .netmodule giriş.
Derleyici COM desteği (#aktarma) desteklenmiyor, bu yönetilmeyen talimatları saf derleme içeri aktaracaktır.
Hizalama ve özel durum işleme için kayan nokta seçenekleri saf derlemeler için ayarlanabilir değildir. Bunun sonucunda, __declspec(align) kullanılamaz. Bu fpieee.h gibi bazı başlık dosyalarını /clr:pure ile kullanılamaz hale getirir.
PSDK'daki GetLastError işlevi /clr:pure ile derlendiğinde tanımsız davranış verebilir .
Doğrulanabilir (/clr:safe)
/clr:safe derleyici seçeneği, kodun mevcut güvenlik ayarlarını ihlal etmemesi için ortak dil çalışma zamanının (CLR) tüm gerekliliklere uyum sağlamasına olanak vererek, Visual Basic ve C# dilinde yazılanlar gibi doğrulanabilen derlemeler üretir. Örneğin, güvenlik ayarları bir bileşenin diske yazmasına engel oluyorsa, CLR kodun herhangi bir kısmını yürütmeden önce doğrulanabilir bir kriterin bu kriteri karşılayıp karşılamadığını belirleyebilir. Doğrulanabilen derlemelere ilişkin CRT desteği mevcut değil. (CRT desteği, C Çalışma Zamanı Kitaplığının bir Saf MSIL sürümü aracılığıyla saf derlemelerde kullanılabilir.)
Doğrulanabilir derlemeler saf ve karışık derlemelere göre bu avantajları sunar:
Arttırılmış güvenlik.
Bazı durumlar bunu gerektirir (örneğin, SQL bileşenleri).
Windows'un gelecekteki sürümleri giderek bileşenlerin ve uygulamaların doğrulanabilir olmasını gerektirecektir.
Tek olumsuz yanı, C++ birlikte çalışma özelliklerinin kullanılabilir durumda olmamasıdır. Doğrulanabilir derlemeler, bunlar yönetilen kod tarafından başvurulmasalar bile hiç bir yönetilmeyen işlev veya yerel veri türü barındıramaz.
"Güvenli" sözcüğünün kullanımına rağmen /clr:safe kullanan derleme uygulamaları, hiçbir hata bulunmadığını ifade etmez, bu yalnızca CLR'nin çalıştırma zamanı içerisindeki güvenlik ayarlarını doğrulayabileceğini ifade etmektedir.
Derleme sürüne bakılmaksızın yönetilen derlemelerden yerel DLL'lere P/Invoke aracılığıyla yapılan çağrılar derlenir ancak güvenlik ayarlarına bağlı olarak bunlar çalışma zamanında başarısız olabilir.
Not
Derleyiciyi geçecek ancak doğrulanamaz bir kod derlemesi içinde sonuçlanacak bir kodlama senaryosu mevcut: kapsam çözünürlük işlecini kullanarak bir nesne örneği aracılığıyla sanal bir işlevi çağırmak.Örneğin: MyObj -> A::VirtualFunction();.