İngilizce dilinde oku

Aracılığıyla paylaş


C++/CLI projesini .NET'e taşıma

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. BIR 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, yalnızca daha -clr:netcore yeni seçeneği (.NET Framework için eşdeğerdir-clr) desteklemez -clr:pure veya -clr:safe derlemeyi desteklemez.

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.

  1. özellikleri ile <CLRSupport>NetCore</CLRSupport>değiştirin<CLRSupport>true</CLRSupport>. Bu özellik genellikle yapılandırmaya özgü özellik gruplarındadır, bu nedenle birden çok yerde değiştirmeniz gerekebilir.
  2. özellikleri ile <TargetFramework>net8.0</TargetFramework>değiştirin<TargetFrameworkVersion>. Etiketi ve değeri değiştirdiğinizden emin olun.
  3. , , System.Windows.FormsSystem.Datave System.Xmlgibi <Reference Include="System" />tüm System.NET Framework başvurularını kaldırın. .NET SDK derlemelerine kullanılırken <CLRSupport>NetCore</CLRSupport>otomatik olarak başvurulur.
  4. .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.
  5. Projeniz yürütülebilir bir projeyse aşağıdaki adımları gerçekleştirin:
    1. Proje türünü bir kitaplık olarak değiştirin.
    2. Yeni bir .NET yürütülebilir projesi oluşturun.
    3. .NET yürütülebilir projesinde C++/CLI .NET kitaplığına başvuru 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:

XML
<!-- Reference all of Windows Forms -->
<FrameworkReference Include="Microsoft.WindowsDesktop.App.WindowsForms" />

WPF API'lerini kullanmak için bu başvuruyu .vcxproj dosyasına ekleyin:

XML
<!-- 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:

XML
<!-- 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 kaldırmanız gerekir. Visual Studio Code gibi başka bir düzenleyici de kullanabilirsiniz.

MSBuild olmadan derleme

MSBuild kullanmadan C++/CLI projeleri derlemek de mümkündür. .NET Core için doğrudan cl.exe ve link.exe ile C++/CLI projesi oluşturmak için şu adımları izleyin:

  1. Derleme sırasında cl.exe geçin -clr:netcore.

  2. Başvuru gerekli .NET başvuru derlemeleri.

  3. Bağlarken, ijwhost.lib dosyasının bulunabilmesi için .NET uygulama ana bilgisayar dizinini olarak LibPathsağlayın.

  4. .NET uygulama ana bilgisayar dizininden projenin çıkış dizinine ijwhost.dll kopyalayın.

  5. Yönetilen kodu çalıştıran uygulamanın ilk bileşeni için bir runtimeconfig.json dosyasının mevcut olduğundan emin olun. Visual Studio'nun en son sürümleri için bir runtime.config dosyası oluşturulur ve otomatik olarak 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 giriş noktasından bir C++/CLI kitaplığı çağrılırsa, giriş noktası derlemesinde çalışma zamanı başlatılırken kullanılan bir dosya olduğundan kitaplığın runtimeconfig.json dosyası gerekmez.

    JSON
    {
       "runtimeOptions": {
          "tfm": "net8.0",
          "framework": {
          "name": "Microsoft.NETCore.App",
          "version": "8.0.0"
          }
       }
    }
    

Not

.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 AssemblyLoadContextbir içine birden çok kez yüklenebilir. C++/CLI derlemesinde yönetilen kodun ilk kez yürütülmesi durumunda:

  • Yerel bir arayandan geliyorsa, derleme ayrı AssemblyLoadContextbir iç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.