Nasıl yapılır: Geçiş /clr
Bu makalede, ile /clr
yerel kod derlenirken ortaya çıkan sorunlar ele alınmaktadır. (Daha fazla bilgi için bkz. /clr (Ortak Dil Çalışma Zamanı Derlemesi).) /clr
yerel C++ kodunun diğer yerel C++ koduna ek olarak .NET derlemelerinden çağrılmasını ve çağrılmasını sağlar. ile /clr
derlemenin avantajları hakkında daha fazla bilgi için bkz . Karma (Yerel ve Yönetilen) Derlemeler ve Yerel ve .NET Birlikte Çalışabilirliği.
kitaplık projelerini derlemeyle ilgili bilinen sorunlar /clr
Visual Studio ile kitaplık projelerini /clr
derlerken bilinen bazı sorunlar içerir:
Kodunuz ile
CRuntimeClass::FromName
çalışma zamanında türleri sorgular. Ancak, bir tür bir MSIL DLL'sindeyse (ile/clr
derlenmiş), statik oluşturucular yönetilen DLL'de çalışmadan önce gerçekleşirse çağrısıFromName
başarısız olabilir. (Kod yönetilen DLL'de yürütüldükten sonra çağrı gerçekleşirseFromName
bu sorunu görmezsiniz.) Bu sorunu geçici olarak çözmek için yönetilen statik oluşturucunun oluşturulmasını zorlayabilirsiniz: yönetilen DLL'de bir işlev tanımlayın, dışarı aktarın ve yerel MFC uygulamasından çağırın. Örneğin:// MFC extension DLL Header file: __declspec( dllexport ) void EnsureManagedInitialization () { // managed code that won't be optimized away System::GC::KeepAlive(System::Int32::MaxValue); }
Visual C++ ile derleme
Projenizdeki herhangi bir modülü kullanmadan /clr
önce yerel projenizi Derleyin ve Visual Studio ile bağlayın.
Sırayla izlenen aşağıdaki adımlar, bir /clr
derlemenin en kolay yolunu sağlar. Bu adımlardan sonra projenizi derlemek ve çalıştırmak önemlidir.
Visual Studio'nun önceki sürümlerinden yükseltme
Visual Studio'yu önceki bir sürümden yükseltiyorsanız, Visual Studio'daki gelişmiş Standart C++ uyumluluğuyla ilgili derleyici hataları görebilirsiniz.
Visual Studio'nun önceki sürümleriyle oluşturulan projeler de önce olmadan /clr
derlenmelidir. Visual Studio artık Standart C++ uyumluluğu ve bazı hataya neden olan değişiklikleri artırdı. En çok dikkat gerektiren değişiklikler CRT'deki Güvenlik Özellikleri'dir. CRT kullanan kodun kullanımdan kaldırma uyarıları üretmesi olasıdır. Bu uyarılar gizlenebilir, ancak daha iyi güvenlik sağladığından ve kodunuzdaki güvenlik sorunlarını ortaya çıkarabileceğinden CRT işlevlerinin güvenlik açısından gelişmiş yeni sürümlerine geçiş tercih edilir.
C++ için Yönetilen Uzantılar'dan yükseltme
Visual Studio 2005 ve sonraki sürümlerinde, C++ için Yönetilen Uzantılar ile yazılan kod altında /clr
derlenmez.
C kodunu C++ koduna dönüştürme
Visual Studio C dosyalarını derlese de, bunları derleme /clr
için C++'a dönüştürmek gerekir. Gerçek dosya adının değiştirilmesi gerekmez; kullanabilirsiniz /Tp
(bkz./Tc
, /Tp
, /TC
, /TP
(Kaynak dosya türünü belirtin).) için /clr
C++ kaynak kodu dosyaları gerekli olsa da, kodunuzu nesne odaklı paradigmalar kullanacak şekilde yeniden düzenlemeniz gerekmez.
C kodu, C++ dosyası olarak derlendiğinde değişiklik yapılmasını gerektirebilir. C++ tür güvenliği kuralları katıdır, bu nedenle tür dönüştürmeleri atamalarla açık hale getirilmelidir. Örneğin, malloc bir void işaretçisi döndürür, ancak C'deki herhangi bir türe atama ile bir işaretçi atanabilir:
int* a = malloc(sizeof(int)); // C code
int* b = (int*)malloc(sizeof(int)); // C++ equivalent
İşlev işaretçileri de C++'ta kesinlikle tür açısından güvenlidir, bu nedenle aşağıdaki C kodunda değişiklik yapılması gerekir. C++'ta, işlev işaretçisi türünü tanımlayan bir typedef
oluşturmak ve ardından işlev işaretçilerini oluşturmak için bu türü kullanmak en iyisidir:
NewFunc1 = GetProcAddress( hLib, "Func1" ); // C code
typedef int(*MYPROC)(int); // C++ equivalent
NewFunc2 = (MYPROC)GetProcAddress( hLib, "Func2" );
C++ ayrıca, işlevlerin başvurulabilmesi veya çağrılabilmesi için önce prototiplerinin veya tam olarak tanımlanmasını gerektirir.
C++ içindeki anahtar sözcükler (örneğin virtual
, , new
, , delete
, bool
, true
, false
vb.) C kodunda kullanılan tanımlayıcılar yeniden adlandırılmalıdır. Bu değişiklik genellikle basit arama ve değiştirme işlemleriyle yapılabilir.
COMObj1->lpVtbl->Method(COMObj, args); // C code
COMObj2->Method(args); // C++ equivalent
Proje ayarlarını yeniden yapılandırma
Projeniz Visual Studio'da derlenip çalıştırıldıktan sonra, varsayılan yapılandırmaları değiştirmek yerine için /clr
yeni proje yapılandırmaları oluşturmanız gerekir. /clr
bazı derleyici seçenekleriyle uyumsuz. Ayrı yapılandırmalar oluşturmak, projenizi yerel veya yönetilen olarak oluşturmanıza olanak tanır. /clr
Özellik sayfaları iletişim kutusunda seçildiğinde, ile /clr
uyumlu olmayan proje ayarları devre dışı bırakılır. (Devre dışı bırakılan seçenekler, daha sonra seçilmemişse /clr
otomatik olarak geri yüklenmez.)
Yeni proje yapılandırmaları oluşturma
Mevcut proje ayarlarınıza göre bir proje yapılandırması oluşturmak için Yeni Proje Yapılandırması İletişim Kutusundaki (Derleme>Configuration Manager>Etkin Çözüm Yapılandırması>Yeni) Ayarları Kopyala seçeneğini kullanabilirsiniz. Hata ayıklama yapılandırması için yapılandırmanızın bir kopyasını ve Yayın yapılandırması için bir kez oluşturun. Bundan sonra, sonraki değişiklikler yalnızca belirli yapılandırmalara /clr
uygulanabilir ve özgün proje yapılandırmaları olduğu gibi bırakılır.
Özel derleme kuralları kullanan projeler fazladan dikkat gerektirebilir.
Bu adımın makefiles kullanan projeler için farklı etkileri vardır. Bu durumda, ayrı bir derleme hedefi yapılandırılabilir veya özgün derlemenin bir kopyasından derlemeye /clr
özgü bir sürüm oluşturulabilir.
Proje ayarlarını değiştirme
/clr
geliştirme ortamında /clr (Ortak Dil Çalışma Zamanı Derlemesi) yönergelerini izleyerek seçilebilir. Daha önce belirtildiği gibi, bu adım çakışan proje ayarlarını otomatik olarak devre dışı bırakır.
Not
Visual Studio 2003'ten yönetilen bir kitaplığı veya web hizmeti projesini /Zl
yükseltirken, komut satırı özellik sayfasına derleyici seçeneği eklenir. Bu, LNK2001 hatalara neden olur. Hataları çözmek için Komut Satırı özellik sayfasından kaldırın/Zl
. Daha fazla bilgi için bkz /Zl
. (Varsayılan kitaplık adını atla) ve Derleyici ve derleme özelliklerini ayarlama.
Derleme dosyalarıyla oluşturulan projeler için uyumsuz derleyici seçenekleri eklendikten sonra /clr
el ile devre dışı bırakılmalıdır. ile /clr
uyumlu olmayan derleyici seçenekleri hakkında bilgi için bkz /clr
. kısıtlamalar.
Önceden derlenmiş üst bilgiler
Önceden derlenmiş üst bilgiler altında /clr
desteklenir. Ancak, CPP dosyalarınızın yalnızca bazılarını ile /clr
derlerseniz (geri kalanını yerel olarak derlerseniz), bazı değişiklikler gereklidir. ile /clr
oluşturulan önceden derlenmiş üst bilgiler, meta veriler oluşturduğundan ve gerektirdiği için /clr
olmadan /clr
oluşturulan önceden derlenmiş üst bilgilerle uyumlu değildir. ile /clr
derlenen modüller meta veri içermeyen önceden derlenmiş üst bilgileri kullanamaz ve modül olmayanlar/clr
meta veri içeren önceden derlenmiş üst bilgi dosyalarını kullanamaz.
Bazı modüllerin derlendiği /clr
bir projeyi derlemenin en kolay yolu, önceden derlenmiş üst bilgileri tamamen devre dışı bırakmaktır. (Proje Özellik Sayfaları iletişim kutusunda C/C++ düğümü ve Önceden Derlenmiş Üst Bilgiler'i seçin. Ardından Önceden Derlenmiş Üst Bilgileri Oluştur/Kullan özelliğini "Önceden Derlenmiş Üst Bilgileri Kullanmıyor" olarak değiştirin.)
Ancak, özellikle büyük projeler için önceden derlenmiş üst bilgiler çok daha iyi derleme hızı sağlar, bu nedenle bu özelliği devre dışı bırakmak istenmez. Bu durumda, ve olmayan/clr
dosyaları önceden derlenmiş ayrı üst bilgileri kullanacak şekilde yapılandırmak /clr
en iyisidir. Bunları tek bir adımda yapılandırabilirsiniz: Çözüm Gezgini kullanarak birlikte derlenecek /clr
modülleri çoklu seçin. Gruba sağ tıklayın ve Özellikler'i seçin. Ardından, sırasıyla farklı bir üst bilgi dosyası adı ve PCH dosyası kullanmak için Hem Dosya Aracılığıyla PCH Oluştur/Kullan hem de Önceden Derlenmiş Üst Bilgi Dosyası özelliklerini değiştirin.
Hataları düzeltme
Kodunuzun derlenmesi derleyici, bağlayıcı veya çalışma zamanı hatalarıyla /clr
sonuçlanabilir. Bu bölümde en yaygın sorunlar ele alınmaktadır.
Meta veri birleştirme
İki tür için oluşturulan meta veriler eşleşmediğinden, farklı veri türlerinin sürümleri bağlayıcının başarısız olmasına neden olabilir. (Bir türün üyelerini koşullu olarak tanımladığınızda hatalar oluşur, ancak koşullar türü kullanan tüm CPP dosyaları için aynı değildir.) Bu durumda bağlayıcı başarısız olur ve yalnızca türün tanımlandığı ikinci OBJ dosyasının sembol adını ve adını bildirir. OBJ dosyalarının bağlayıcıya gönderilme sırasını döndürerek veri türünün diğer sürümünün konumunu bulmanın yararlı olduğunu fark edebilirsiniz.
Yükleyici kilidi kilitlenmesi
"Yükleyici kilidi kilitlenmesi" oluşabilir, ancak belirlenimcidir ve çalışma zamanında algılanır ve bildirilir. Ayrıntılı arka plan, rehberlik ve çözümler için bkz . Karma Derlemeleri Başlatma.
Veri dışarı aktarma işlemleri
DLL verilerini dışarı aktarmak hataya açıktır ve kodda /clr
önerilmez. Bunun nedeni, DLL'nin yönetilen bir bölümü yürütülene kadar DLL'nin veri bölümünün başlatılmasının garantiye alınmadığıdır. Yönergeleri olan #using
başvuru meta verileri.
Tür görünürlüğü
Yerel türler varsayılan olarakdır private
. private
Yerel bir tür DLL'nin dışında görünmez. Bu türlere ekleyerek public
bu hatayı düzeltin.
Kayan nokta ve hizalama sorunları
__controlfp
ortak dil çalışma zamanında desteklenmez. (Daha fazla bilgi için bkz. _control87
, _controlfp
, __control87_2
.) CLR de saygı align
göstermez.
COM başlatma
Ortak Dil Çalışma Zamanı, bir modül başlatıldığında COM'ı otomatik olarak başlatır (COM otomatik olarak başlatıldığında MTA olarak yapılır). Sonuç olarak, COM'un açıkça başlatılması, COM'un zaten başlatıldığını gösteren dönüş kodları verir. CLR başka bir iş parçacığı modeline COM'yi zaten başlatmışsa, bir iş parçacığı modeliyle COM'yi açıkça başlatmaya çalışmak uygulamanızın başarısız olmasına neden olabilir.
Ortak dil çalışma zamanı COM'yi varsayılan olarak MTA olarak başlatır; COM modelini değiştirmek için kullanın /CLRTHREADATTRIBUTE
(CLR iş parçacığı özniteliğini ayarlayın).
Performans sorunları
MSIL'de oluşturulan yerel C++ yöntemleri dolaylı olarak çağrıldığında (sanal işlev çağrıları aracılığıyla veya işlev işaretçileri kullanılarak) performansın azaldığını görebilirsiniz. Daha fazla bilgi edinmek için bkz . Çift Thunking.
Yerelden MSIL'e geçtiğinizde, çalışma kümenizin boyutunda bir artış göreceksiniz. Bu artış, ortak dil çalışma zamanının programların düzgün çalıştığından emin olmak için birçok özellik sağlaması nedeniyle oluşur. Uygulamanız /clr
düzgün çalışmıyorsa varsayılan olmayan Derleyici Uyarısı (düzey 1 ve 3) C4793'i etkinleştirmek isteyebilirsiniz.
Program kapatılmada kilitleniyor
Bazı durumlarda, yönetilen kodunuzun çalışması tamamlanmadan önce CLR kapatılabilir. ve SIGTERM
kullanımı std::set_terminate
kapatmaya neden olabilir. Daha fazla bilgi için bkz signal
. sabitler ve set_terminate
.
Yeni Visual C++ özelliklerini kullanma
Uygulamanız derledikten, bağlantılar ve çalıştırıldıktan sonra ile /clr
derlenen herhangi bir modülde .NET özelliklerini kullanmaya başlayabilirsiniz. Daha fazla bilgi için bkz . Çalışma Zamanı Platformları için Bileşen Uzantıları.
Visual C++'da .NET programlama hakkında daha fazla bilgi için bkz: