Nasıl yapılır: Geçiş /clr

Bu makalede, ile /clryerel 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 /clrderlemenin 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 /clrderlerken 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 /clrderlenmiş), 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şirse FromName 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 /clrderlenmelidir. 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 /clrderlenmez.

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 /clrC++ 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, falsevb.) 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 /clruygulanabilir 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

/clrgeliş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 /clruyumlu olmayan derleyici seçenekleri hakkında bilgi için bkz /clr . kısıtlamalar.

Önceden derlenmiş üst bilgiler

Önceden derlenmiş üst bilgiler altında /clrdesteklenir. 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 /clroluş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ı aligngö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 /clrderlenen 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:

Ayrıca bkz.

Karışık (Yerel ve Yönetilen) Derlemeler