Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Visual Studio 2019'da C++/CLI projeleri .NET'i hedefleyebilir. Bu destek, Windows masaüstü uygulamalarını C++/CLI birlikte çalışma katmanlarıyla .NET Framework'ten .NET'e taşımayı mümkün kılar. Bu makalede, C++/CLI projelerinin .NET Framework'ten .NET'e nasıl taşınabilir olduğu açıklanır.
C++/CLI .NET Core sınırlamaları
.NET Framework ile karşılaştırıldığında C++/CLI projeleri ve .NET ile ilgili bazı önemli sınırlamalar vardır:
- C++/CLI projesinin yürütülebilir dosyaya derlenmesi desteklenmez. DLL'ye derlemeniz gerekir.
- .NET için C++/CLI desteği yalnızca Windows'dur.
- C++/CLI projeleri .NET Standard'i hedefleyemez.
- C++/CLI projeleri daha yeni SDK stilindeki proje dosya biçimini desteklemez. Bunun yerine C++/CLI projeleri, diğer Visual Studio C++ projelerinin kullandığı .vcxproj dosya biçimini kullanır.
- C++/CLI projeleri birden çok .NET platformlarını hedefleyemez. .NET ve .NET Framework için bir C++/CLI projesi oluşturmanız gerekiyorsa, ayrı proje dosyaları kullanın.
- .NET
-clr:pureveya-clr:safederlemeyi desteklemez, yalnızca daha yeni-clr:netcoreseçeneğini destekler (bu, .NET Framework için-clrile eşdeğerdir).
C++/CLI projelerini taşıma
C++/CLI projesini .NET'e getirmek için .vcxproj dosyasında aşağıdaki değişiklikleri yapın. C++/CLI projeleri SDK stili proje dosyalarını kullanmadığından bu geçiş adımları diğer proje türleri için gereken adımlardan farklıdır.
-
<CLRSupport>true</CLRSupport>özellikleri<CLRSupport>NetCore</CLRSupport>ile değiştirin. Bu özellik genellikle yapılandırmaya özgü özellik gruplarındadır, bu nedenle birden çok yerde değiştirmeniz gerekebilir. -
<TargetFrameworkVersion>özellikleri<TargetFramework>net8.0</TargetFramework>ile değiştirin. Etiketi ve değeri değiştirdiğinizden emin olun. - Herhangi bir
System,System.Data,System.Windows.Forms, veSystem.Xmliçin .NET Framework başvurularını,<Reference Include="System" />gibi, kaldırın. .NET SDK derlemelerine<CLRSupport>NetCore</CLRSupport>kullanılırken otomatik olarak başvurulur. - . NET'te kullanılamayan API'leri kaldırmak için .cpp dosyalarındaki API kullanımını gerektiği gibi güncelleştirin. C++/CLI projeleri oldukça ince birlikte çalışma katmanları olma eğiliminde olduğundan, genellikle çok fazla değişiklik gerekmez. C++/CLI ikili dosyaları tarafından kullanılan desteklenmeyen .NET API'lerini tanımlamak için .NET Taşınabilirlik Çözümleyicisi'ni kullanabilirsiniz.
- Projeniz yürütülebilir bir projeyse aşağıdaki adımları gerçekleştirin:
- Proje türünü bir kitaplık olarak değiştirin.
- Yeni bir .NET yürütülebilir projesi oluşturun.
- .NET yürütülebilir projesinde C++/CLI .NET kütüphanesine referans ekleyin.
WPF ve Windows Forms kullanımı
.NET C++/CLI projeleri Windows Forms ve WPF API'lerini kullanabilir. Bu Windows masaüstü API'lerini kullanmak için kullanıcı arabirimi kitaplıklarına açık çerçeve başvuruları eklemeniz gerekir. Windows masaüstü API'lerini kullanan SDK stili projeler, SDK kullanarak gerekli çerçeve kitaplıklarına otomatik olarak başvurur Microsoft.NET.Sdk.WindowsDesktop . C++/CLI projeleri SDK stili proje biçimini kullanmadığından, .NET Core'ı hedeflerken açık çerçeve başvuruları eklemeleri gerekir.
Windows Forms API'lerini kullanmak için bu başvuruyu .vcxproj dosyasına ekleyin:
<!-- Reference all of Windows Forms -->
<FrameworkReference Include="Microsoft.WindowsDesktop.App.WindowsForms" />
WPF API'lerini kullanmak için bu başvuruyu .vcxproj dosyasına ekleyin:
<!-- Reference all of WPF -->
<FrameworkReference Include="Microsoft.WindowsDesktop.App.WPF" />
Hem Windows Forms hem de WPF API'lerini kullanmak için bu başvuruyu .vcxproj dosyasına ekleyin:
<!-- Reference the entirety of the Windows desktop framework:
Windows Forms, WPF, and the types that provide integration between them -->
<FrameworkReference Include="Microsoft.WindowsDesktop.App" />
Şu anda Visual Studio'nun başvuru yöneticisini kullanarak bu başvuruları eklemek mümkün değildir. Bunun yerine, proje dosyasını el ile düzenleyerek güncelleştirin. Visual Studio'da önce projeyi boşaltmanız gerekir. Visual Studio Code gibi başka bir düzenleyici de kullanabilirsiniz.
MSBuild'siz derleme
MSBuild kullanmadan C++/CLI projeleri derlemek de mümkündür. .NET Core için doğrudancl.exe ve link.exe ile bir C++/CLI projesi oluşturmak için şu adımları izleyin:
Derlerken
-clr:netcore'yı cl.exe olarak geçirin.Gerekli .NET başvuru kütüphaneleri.
Bağlarken,
LibPathdosyasının bulunabilmesi için .NET uygulama ana bilgisayar dizinini olarak sağlayın..NET uygulama ana bilgisayar dizininden projenin çıkış dizinine ijwhost.dll kopyalayın.
Yönetilen kodu çalıştıran uygulamanın ilk bileşeni için birruntimeconfig.json dosyasının mevcut olduğundan emin olun. Visual Studio'nun en son sürümleri için otomatik olarak birruntime.config dosyası oluşturulur ve kopyalanır.
Visual Studio'nun eski sürümlerinde, uygulamanın yerel bir giriş noktası varsa, .NET çalışma zamanını kullanmak üzere ilk C++/CLI kitaplığı için aşağıdaki runtimeconfig.json dosyasını el ile oluşturmanız gerekir. Yönetilen bir giriş noktasından C++/CLI kitaplığı çağrılırsa, giriş noktası derlemesinde çalışma zamanı başlatıldığında kullanılan bir runtimeconfig.json dosyası bulunduğundan, kitaplığın böyle bir dosyaya ihtiyacı yoktur.
{ "runtimeOptions": { "tfm": "net8.0", "framework": { "name": "Microsoft.NETCore.App", "version": "8.0.0" } } }
Uyarı
.NET 7 veya sonraki bir sürümü hedefleyen C++/CLI derlemeleri her zaman varsayılan AssemblyLoadContextiçine yüklenir. Ancak, .NET 6 ve önceki sürümlerinde, C++/CLI derlemeleri her seferinde yeni bir AssemblyLoadContext içine birden çok kez yüklenebilir. C++/CLI derlemesinde yönetilen kodun ilk kez yürütülmesi durumunda:
- Yerel bir arayandan ise, derleme ayrı bir
AssemblyLoadContextiçine yüklenir. - Yönetilen bir çağırandan gelen derleme, genellikle varsayılan olan çağıranla aynı
AssemblyLoadContextşekilde yüklenir.
C++/CLI derlemenizi her zaman varsayılan AssemblyLoadContextiçine yüklemek için, giriş noktası derlemenizden C++/CLI derlemenize bir "initialize" stil çağrısı ekleyebilirsiniz. Daha fazla bilgi için bu dotnet/runtime sorununa bakın.