Aracılığıyla paylaş


Nasıl yapılır: /clr:pure'a Geçiş Yapma

Bu konu /clr:pure kullanarak saf MSIL'e geçerken çıkabilecek sorunları anlatır (bkz. /CLR (Genel dil çalışma zamanı derleme)). Bu konu, yönetilmeyen koddan saf MSIL'e geçiş yolunun doğrudan olmaması sebebiyle geçirilen kodun şuan /clr kullanılarak karışık derleme olarak derlendiğini var saymaktadır. Yönetilmeyen kod için, saf MSIL'e geçirmeye çalışmadan önce bkz. /clr'a Geçiş Nasıl Yapılır.

Temel Değişiklikler

Saf MSIL, MSIL yönergelerinden oluşmuştur, bu sebeple MSIL'de ifade edilmeyen işlevleri içeren kod derlemeyi önleyecektir. Bu __clrcall'dan başka çağırma kurallarını kullanarak tanımlanan işlevleri içerir. (__clrcall olmayan işlevler saf MSIL'den çağrılabilir fakat, tanımlanamaz.)

Çalışma zamanı hatalarının olmamasını garanti etmek için, C4412 uyarılarını etkinleştirmelisiniz. C4412'yi /clr:pure ile derlediğin ve C++ türlerini IJW'ye ve IJW'den (/clr) geçiren her derlenen dosyaya veya yerel koda #pragma warning (default : 4412) ekleyerek etkinleştirin. Daha fazla bilgi için bkz. derleyici uyarısı (Seviye 2) C4412.

Mimari ile İlgili Dikkat Edilecek Noktalar

Saf ve Doğrulanabilen Kod'da listelenen saf MSIL derlemeleri sınırlamalarının bazılarının uygulama tasarımına ve geçiş stratejisine yüksek düzeyde etkileri vardır. En belirgin olarak, karışık derlemelerin aksine, saf MSIL derlemeleri yönetilmeyen modüllerle tam uyumluluktan faydalanamazlar.

Saf MSIL derlemeleri yönetilmeyen işlevleri çağırabilir ancak, yönetilmeyen işlevler tarafından çağrılamazlar. Sonuç olarak, saf MSIL yönetilmeyen işlevleri kullanan istemci kodu için yönetilmeyen işlevler tarafından kullanılan sunucular için olduğundan daha iyi bir adaydır. Eğer saf MSIL derlemesinde bulunan özellikler yönetilmeyen işlevler tarafından kullanılacak olsaydı, bir karışık derlemenin arayüz olarak kullanılması gerekirdi.

ATL veya MFC kullanan uygulamalar saf MSIL'e geçiş için uygun adaylar değildir çünkü bu kitaplıklar bu sürümde desteklenmemiştir. Benzer şekilde, Windows SDK, /clr:pure ile derlenmeyen başlık dosyaları içerir.

Saf MSIL derlemeleri yönetilmeyen işlevleri çağırabilirken, bu özellik basit C stili işlevlerle sınırlandırılmıştır. Daha karmaşık yönetilmeyen API'ların kullanımı yönetilmeyen işlevlerin, saf MSIL ile yönetilmeyen bileşenler arasında arayüz olarak davranacak karışık derlemeler veya COM arayüzü biçiminde ortaya çıkmasını gerektirebilir. Karışık derleme katmanı kullanımı geri arama işlevleri alan yönetilmeyen işlevleri kullanmak için tek yoldur, örneğin, saf derleme olarak geri arama için kullanılacak yerel çağrılabilir işlev sağlayamaz.

Uygulama Etki Alanları ve Çağırma Kuralları

Saf MSIL derlemeleri için yönetilmeyen özellikler mümkün olmasına rağmen, işlevler ve statik veriler farklı işlenir. Saf derlemelerde, işlevler __clrcall çağırma kuralıyla uygulanır ve her uygulama etki alanı için statik veri saklanır. Bu, işlevler için __cdecl çağırma kuralı kullanan ve her işlem için statik veri saklayan yönetilmeyen ve karışık derlemeler var sayılanından farklılık gösterir.

Saf MSIL (ve /clr:safe ile derlenmiş doğrulanabilen kod) bağlamında, bu varsayılanlar saydamdır, çünkü __clrcall CLR çağırma kuralının varsayılanıdır ve uygulama etki alanı .NET uygulamalarında statik ve genel veriler için yerel kapsamdır. Ancak, yönetilmeyen veya karışık bileşenlerde arayüz kullanılırken, işlevlere ve genel verilere farklı davranılması sorunlara sebep olabilir.

Örneği, saf MSIL bileşeni, yönetilmeyen veya karışık DLL'den işlev çağırırsa, DLL başlık dosyası saf derlemeyi derlemek için kullanılacaktır. Ancak, başlıktaki her işlev için çağırma kuralı açıkça belirtilmedikçe, __clrcall olduğu var sayılacaktır. Bu daha sonra çalışma zamanı hatalarına sebep olacaktır çünkü, işlevler büyük ihtimalle __cdecl kuralı ile uygulanmıştır. Yönetilmeyen başlık dosyasındaki işlevler açıkça __cdecl olarak işaretlenebilir veya tüm DLL kaynak kodu /clr:pure ile yeniden derlenmelidir.

Benzer şekilde, /clr:pure derlemesinde işlev işaretçilerinin __clrcall işlevlerine işaret ettiği var sayılır. Bunlar da doğru çağırma kurallarıyla açıkça açıklanmalıdır.

Daha fazla bilgi için bkz. Uygulama Etki Alanları ve Visual C++.

Bağlama Kısıtlamaları

Visual C++ bağlayıcısı karışık ve saf OBJ dosyalarını bağlamaya çalışmayacaktır, çünkü depolama kapsamı ve çağırma kuralı farklıdır.

Ayrıca bkz.

Başvuru

Saf ve Doğrulanabilen Kod