Aracılığıyla paylaş


/clr'a Geçiş Nasıl Yapılır

Bu konu yerel kodu /clr öğesiyle derlerken çıkabilecek sorunları açıklamaktadır. (Daha fazla bilgi için bakınız: /CLR (Genel dil çalışma zamanı derleme)) /clr, Visual C++ modüllerinin yönetilmeyen modüller ile uyumluluğunu korurken .NET derlemelerini çağırmasına ve bunlardan çağrılmasına izin verir. /clr bilgisi ile derlenen öğenin avantajları hakkında daha fazla bilgi için Karışık (Yerel ve Yönetilen) Derlemeler ve Yerel ve.NET Birlikte Çalışabilirliği bilgilerine bakınız.

Derleme Kitaplığı Projelerini /clr ile Derleme Konusunda Bilinen Sorunlar

Visual Studio kitaplık projelerinizi /clr ile derlerken bazı bilinen sorunlar içerir:

  • Kodunuz CRuntimeClass::FromName ile çalışma zamanında türleri sorgulayabilir. Ancak, tür bir MSIL .dll içindeyse (/clr ile derlenmiş), CRuntimeClass::FromName çağrısı yönetilen .dll içinde statik kurucular çalıştırmadan önce gerçekleştiği takdirde başarısız olabilir (FromName çağrısı kod .dll içinde yürütüldükten sonra olursa bu sorunu görmezsiniz). Bu sorunun etrafından dolaşmak için yönetilen .dll'de bir işlev tanımlayarak, bunu dışa aktararak ve yerel MFC uygulamasından başlatarak yönetilen statik oluşturucunun oluşturulmasını sağlayabilirsiniz. Örneğin:

    // 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

/clr öğesini projenizdeki herhangi bir modülde kullanmadan önce yerli projenizi Visual Studio 2010 ile derleyin ve bağlayın.

Aşağıdaki adımlar sırasıyla bir /clr derlemesine giden en kolay yolu sağlar. Bu adımların her birinden sonra projenizi derleyip çalıştırmak önemlidir.

Visual C++ 2003'ten Önceki Sürümler

Visual C++ 2003 sürümünden daha eski bir sürümden Visual Studio 2010'a yükseltme yapıyorsanız Visual C++ 2003'teki gelişmiş C++ standart uygunluğuna bağlı derleyici hataları ile karşılaşabilirsiniz.

Visual C++ 2003'ten yükseltmek

Visual Studio'nun ANSI/ISO uyumunu artırması ve bazı yeni değişiklikler nedeniyle, daha önce Visual C++ 2003 ile oluşturulan projelerin öncelikle /clr olmadan derlenmesi gerekir. Muhtemelen en çok dikkat gerektirecek değişiklik Security Enhancements in the CRT idir. CRT kullanan kodun onaylanmamış uyarılar üretmesi oldukça muhtemeldir. Bu uyarılar bastırılabilir, ancak daha iyi güvenlik sağladıklarından ve kodunuzda bulunan güvenlik sorunlarını açığa çıkarabileceklerinden, yeni Security-Enhanced Versions of CRT Functions öğesine geçiş tercih edilir.

C++ için Yönetilen Uzantılar'dan Yükseltme

C++ için Yönetilen Uzantılar kullanan Visual C++.NET veya Visual C++ 2003 ile oluşturulan projeler, bu uzantılar artık kullanım dışı olduğundan, proje ayarlarında en az bir değişiklik yapılmasını gerektirecektir. Bunun sonucunda, C++ için Yönetilen Uzantılar ile yazılan kod, /clr altında derlenemeyecektir. Onun yerine /clr:oldSyntax kullanın.

C Kodunu C++ olarak Dönüştürme

Her ne kadar, Visual Studio, C dosyalarını derleyecek olsa da, /clr derlemesi açısından onları C++'ye dönüştürmek gereklidir. Gerçek dosya adının değiştirilmesi gerekmez; /Tp kullanabilirsiniz (bkz. / Tc, /Tp, /TC, /TP (kaynak dosya tür belirtin).) /clr için C++ kaynak kodu dosyaları gerekli olsa da, nesneye yönelik paradigmaları kullanmak için kodunuzu yeniden düzenlemenize gerek yoktur.

C kodu, C++ dosyası olarak derlendiğinde büyük olasılıkla değişiklikler gerektirir. C++ tür güvenliği kuralları sıkıdır, bu yüzden tür çevrimleri çevrimlerde açıkça belirtilmelidir. Örneğin, malloc geçersiz bir işaretçi döndürür, ancak dönüştürmeye sahip C içindeki herhangi bir türe işaretçi olarak atanabilir:

int* a = malloc(sizeof(int));   // C code
int* b = (int*)malloc(sizeof(int));   // C++ equivalent

C++'ta işlev işaretçileri de kesinlikle tür kullanımı uyumludur, bu nedenle aşağıdaki C Kodu değişiklik gerektirir. C++'da işlev işaretçisi türü tanımlayan typedef öğesi oluşturmak ve sonra bu türü işlev işaretçisi dönüştürmek için kullanmak en iyisidir:

NewFunc1 = GetProcAddress( hLib, "Func1" );   // C code
typedef int(*MYPROC)(int);   // C++ equivalent
NewFunc2 = (MYPROC)GetProcAddress( hLib, "Func2" );

Ayrıca C++ işlevlerin başvurulmadan veya çağrılmadan önce örneklenmesini ya da tam olarak tanımlanmasını gerektirir.

C kodunda kullanılan tanımlayıcılar, C++'da anahtar kelimelerse (virtual, new, delete, bool, true, false, vb. gibi) yeniden adlandırılmaları gerekir. Bu genellikle basit bul ve değiştir işlemleriyle ile yapılabilir.

Son olarak, C tarzı COM çağrıları v tablosunun ve this işaretçisinin açık kullanımını gerektirdiğinde, C++ şunları desteklemez:

COMObj1->lpVtbl->Method(COMObj, args);  // C code
COMObj2->Method(args);  // C++ equivalent

Proje Ayarlarını yeniden yapılandır

Projeniz Visual Studio 2010'da derleyip çalıştıktan sonra, varsayılan yapılandırmaları değiştirmek yerine /clr için yeni proje yapılandırmaları oluşturmanız gerekir. /clr, bazı derleyici seçenekleri ile uyumlu değildir ve ayrı yapılandırmalar oluşturma da projenizi yerel ya da yönetilen şeklinde oluşturmanızı sağlar. Özellik sayfaları iletişim kutusunda /clr öğesi seçildiğinde, /clr ile uyumlu olmayan proje ayarları devre dışı bırakılır (ve /clr sonradan seçildiyse devre dışı bırakılmış seçenekler otomatik olarak geri yüklenmez).

Yeni Proje Yapılandırmaları Oluşturma

Ayarları Şuradan Kopyala seçeneğini Yeni Proje yapılandırması yapılandırması İletişim Kutu Kutu içinde mevcut proje ayarlarınızı temel alan bir proje yapılandırması oluşturmak için kullanabilirsiniz. Bunu bir kez Hata Ayıklama yapılandırması için ve bir kez de Yayım yapılandırması için yapın. Bundan sonraki değişiklikler, daha sonra asıl proje yapılandırmalarını eksiksiz bırakarak /clr'ye özgü yapılandırmalar için geçerli olabilir.

Özel derleme kuralları kullanan projeler, özel dikkat gerektirebilir.

Bu adım, derleme görevleri dosyaları kullanan projelere farklı biçimlerde etki eder. Bu durumda ayrı bir yapı hedefi yapılandırılabilir veya özgün olanın bir kopyasından sürüme özgü bir /clr derlemesi oluşturulabilir.

Proje Ayarlarını Değiştirin

/clr, /CLR (Genel dil çalışma zamanı derleme) bağlantısındaki yönergeler izlenerek geliştirme ortamında seçilebilir. Daha önce belirtildiği gibi bu adım çakışan proje ayarlarını otomatik olarak devre dışı bırakır.

Not

Yönetilen bir kitaplığı veya web hizmetini Visual C++ 2003'ten yükseltirken, /Zl derleyici seçeneği Komut Satırı özellik sayfasına eklenir. Bu LNK2001'e neden olur. Çözmek için /Zl öğesini Komut Satırı özellik sayfasından kaldırın. Daha fazla bilgi için bkz. /Zl (varsayılan kitaplık ihmal ad) ve Nasıl Yapılır: Proje Özelliği Sayfa açma. Veya bağlayıcının Ek Bağımlılıklar özelliğine msvcrt.lib ve msvcmrt.lib ekleyin

Makefiles ile oluşturulan projeler için, /clr eklendiğinde uyumsuz derleyici seçeneklerinin el ile devreden çıkarılması gerekir. Bkz. //CLR kısıtlamaları ile uyumlu olmayan derleyici seçenekleri hakkında bilgi için /clr.

Önceden Derlenmiş Başlıklar

Önceden derlenmiş başlıklar, /clr altında desteklenir. Ancak, CPP dosyalarınızın yalnızca bir kısmını /clr ile derlerseniz (doğal olarak kalanı derleme), /clr ile oluşturulan önceden derlenmiş üstbilgiler /clr olmadan derlenenlerle uyumlu olmadığı için bazı değişiklikler gerekecektir. Bu uyumsuzluğun nedeni /clr öğesinin meta veri oluşturması ve gerektirmesidir. Bu nedenle, /clr derlenmiş modülleri meta veri içermeyen önceden derlenmiş üstbilgileri kullanamazken, /clr dışı modüller meta veri içeren önceden derlenmiş üst bilgileri kullanamaz.

Bazı modüllerin derlendiği bir projeyi derlemenin en kolay yolu /clr önceden derlenmiş üstbilgileri tamamen devre dışı bırakmaktır. (Proje Özellik Sayfaları iletişim kutusunda, C/C++ düğümünü açıp Önceden Derlenmiş Başlıkları seçin. Sonra Önceden Derlenmiş Üstbilgileri Oluştur/Kullan özelliğini "Önceden Derlenmiş Başlıklar Kullanılmıyor" öğesine değiştirin.

Ancak, özellikle büyük projeler için, önceden derlenmiş üstbilgileri çok daha iyi toplama hızı sağlar, bu nedenle bu özelliğin devre dışı bırakılması arzu edilmez. Bu durumda, en iyisi, ayrı önceden derlenmiş üstbilgileri kullanmak için /clr öğesini ve /clr olmayan öğeyi yapılandırmaktır. Bu, /clr öğesinin derlenmesine ilişkin Çözüm Gezginini kullanmak yoluyla modülleri birden fazla seçerek, grup üzerinde sağa tıklatarak ve Özellikler öğesini seçerek, bir adımda yapılabilir. Sonra farklı bir üstbilgi dosya adı ve PCH dosyası kullanmak için sırasıyla Dosya Üzerinden PCH Oluştur/Kullan ve Önceden Derlenmiş Üstbilgi Dosyası özelliklerini değiştirin.

Hataları Düzeltme

/clr ile yapılan derleme, derleyici, bağlayıcı veya çalışma zamanı hatalarına neden olabilir. Bu bölümde, en sık karşılaşılan sorunlar anlatılmaktadır.

Meta Veri Birleştirme

İki tür için oluşturulan meta veri eşleşmediği için farklı veri türü sürümleri bağlayıcının başarısız olmasına neden olabilir. (Bu durum genellikle bir türün üyeleri şartlı olarak tanımlandığında ancak koşulların türü kullanan tüm CPP dosyaları için aynı olmadığında meydana gelir.) Bu durumda yalnızca simge adı ve türü tanımlandığı ikinci OBJ dosyasının adını raporlayarak bağlayıcı başarısız olur. Veri türünün öteki sürümünün konumunu keşfetmek için OBJ dosyalarının bağlayıcıya gönderiliş sırasını döndürmek çoğu zaman işe yarar.

Yükleyici Kilitlenmesi

Visual C++.NET ve Visual c++ 2003'te /clr altında başlatma kararsız kilitlenme olasılığı taşıyordu. Bu sorun, "yükleyici kilidi kilitlenmesi" olarak bilinir. Visual Studio 2010'da bu kilitlenmeyi önlemek daha kolaydır, çalışma zamanında algılanır ve raporlanır, ayrıca artık kararlıdır. Yükleme kilidi sorunu ile karşılaşmak halen olasıdır ancak artık bu sorundan kaçınmak ve sorunu gidermek çok daha kolaydır. Detaylı arka plan, kılavuz ve çözümler için bkz. Karışık Derlemeleri Başlatma.

Veri Dışa Aktarma İşlemleri

DLL'leri dışa aktarmak hataya neden olabilir ve önerilmez. Bu, bir DLL'nin veri bölümünün başlatılmasının, DLL'nin yönetilen bir kısmı yürütülene kadar garanti edilmemesinden kaynaklanır. Meta verilere The #using Directive aracılığıyla başvurun.

Tür Görünürlüğü

Yerel türler varsayılan olarak özel yapıldı. Visual C++, .NET 2002 ve Visual C++ 2003'te, yerli türler varsayılan olarak ortaktı. Bu DLL dışında görünür olmayan bir yerel türle sonuçlanabilir. Bu tür hataları, bunlara public ekleyerek giderin. Daha fazla bilgi için bkz. Type and Member Visibility.

Kayan Nokta ve Hizalama Sorunları

__controlfportak dil çalışma zamanında desteklenmiyor (daha fazla bilgi için bkz. _control87, _controlfp, __control87_2). CLR ayrıca align (C++)'a da saygı göstermeyecektir.

COM Başlatma

Bir modül başlatıldığında, Ortak Dil Çalışma Zamanı, COM'u otomatik olarak başlatır (COM otomatik olarak başlatıldığında MTA gibi 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ı getirir. CLR, COM'u daha önce başka bir iş parçacığı modeline sıfırlamışsa, COM'u tek iş parçacığı oluşturma modeli ile başlatmaya çalışmak, uygulamanızın başarısız olmasına neden olabilir.

Ortak dil çalışma zamanı COM'u varsayılan ve MTA olarak başlatır; bunu değiştirmek için / CLRTHREADATTRIBUTE (öznitelik kümesi CLR iş parçacığı) adresini kullanın.

Performans Sorunları

MSIL için üretilen yerel C++ yöntemleri dolaylı olarak çağrıldığında (sanal işlev çağrıları veya işlev işaretçileri kullanarak) performansın azaldığını görebilirsiniz. Bunun hakkında daha fazla bilgi için bkz. Çift Dönüştürme (C++).

Yerelden MSIL'e taşırken, çalışma kümenizin boyutunda bir büyüme fark edeceksiniz. Bu, ortak dil çalışma zamanının programların doğru çalışmasını sağlamak için birçok özellik sağlamasından kaynaklanır. /clr uygulamanız düzgün çalışmıyorsa, C4793 öğesini etkinleştirmek isteyebilirsiniz (varsayılan olarak kapalıdır), daha fazla bilgi için bkz. derleyici uyarısı (Seviye 1 ve 3) C4793.

Kapatma Sırasında Program Kilitleniyor

Bazı durumlarda, yönetilen kodunuzun çalışması bitmeden CLR kapatılabilir. std::set_terminate ve SIGTERM kullanmak buna neden olabilir. Daha fazla bilgi için bkz. signal Constants ve set_terminate (<exception>).

Yeni Visual C++ Özelliklerini Kullanmak

Uygulamanız derledikten, bağlantı kurduktan ve çalıştıktan sonra, /clr ile derlenmiş herhangi bir modülde .NET özelliklerini kullanmaya başlayabilirsiniz. Daha fazla bilgi için bkz. Language Features for Targeting the CLR.

C++ için Yönetilen Uzantılar'ı kullandıysanız kodunuzu sözdizimini kullanmaya dönüştürebilirsiniz. Söz dizimi farklarının özeti için bkz. Managed Extensions for C++ Syntax Upgrade Checklist. C++ için Yönetilen Uzantıları dönüştürme hakkında ayrıntılı bilgi için bkz. C++/CLI Geçiş Öncüsü.

Visual C++ içinde .NET programlama hakkında daha fazla bilgi için bkz.

Ayrıca bkz.

Kavramlar

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