Visual StudioとCMakeの連携:"DOTNET_TARGET_FRAMEWORK"プロパティで.NET Frameworkターゲティングを極める


CMake の "DOTNET_TARGET_FRAMEWORK" プロパティは、Visual Studio 2010以降のジェネレータを使用する場合に、C++/CLI および C# プロジェクトのターゲット .NET フレームワークを指定するために使用されます。このプロパティは、ターゲット レベルで設定するか、CMAKE_DOTNET_TARGET_FRAMEWORK 変数を使用してすべてのターゲットにグローバルに設定することができます。

構文

target_property(TARGET target_name DOTNET_TARGET_FRAMEWORK framework)
  • framework:ターゲットが使用する .NET フレームワークのバージョンを指定します。例:netcoreapp3.1
  • TARGET:プロパティを設定するターゲットの名前を指定します。

グローバル設定

CMAKE_DOTNET_TARGET_FRAMEWORK 変数を使用して、すべてのターゲットに .NET フレームワークをグローバルに設定することができます。

set(CMAKE_DOTNET_TARGET_FRAMEWORK framework)

以下の例では、mytarget という名前のターゲットの .NET フレームワークを netcoreapp2.1 に設定します。

target_property(TARGET mytarget DOTNET_TARGET_FRAMEWORK netcoreapp2.1)

以下の例では、すべてのターゲットの .NET フレームワークを netcoreapp3.1 にグローバルに設定します。

set(CMAKE_DOTNET_TARGET_FRAMEWORK netcoreapp3.1)
  • CMAKE_DOTNET_TARGET_FRAMEWORK 変数と DOTNET_TARGET_FRAMEWORK プロパティの両方を設定した場合、後者の設定が優先されます。
  • DOTNET_TARGET_FRAMEWORK プロパティは、Visual Studio 2010以降のジェネレータのみでサポートされています。


netcoreapp3.1 をターゲットとするプロジェクト

cmake_minimum_required(VERSION 3.17)

project(myproject1)

set(CMAKE_DOTNET_TARGET_FRAMEWORK netcoreapp3.1)

add_executable(mytarget1 mytarget1.cpp)

net6.0 をターゲットとするプロジェクト

cmake_minimum_required(VERSION 3.17)

project(myproject2)

target_property(TARGET mytarget2 DOTNET_TARGET_FRAMEWORK net6.0)

add_executable(mytarget2 mytarget2.cpp)
  1. 上記のコードは、CMake の cmake_minimum_required コマンドを使用して、CMake バージョン 3.17 以降が必要であることを指定します。
  2. 次に、project コマンドを使用して、各プロジェクトの名前 (myproject1 および myproject2) を定義します。
  3. set コマンドを使用して、CMAKE_DOTNET_TARGET_FRAMEWORK 変数を netcoreapp3.1 に設定します。これにより、myproject1 プロジェクト内のすべてのターゲットは、.NET Framework 3.1 をターゲットとするようになります。
  4. add_executable コマンドを使用して、mytarget1 および mytarget2 という名前の実行可能ファイルをそれぞれ作成します。
  5. myproject2 プロジェクトの場合、target_property コマンドを使用して、mytarget2 ターゲットの DOTNET_TARGET_FRAMEWORK プロパティを net6.0 に設定します。これにより、mytarget2 ターゲットは .NET Framework 6.0 をターゲットとするようになります。
  • この例は、Visual Studio 2010以降のジェネレータを使用していることを前提としています。


代替方法

"DOTNET_TARGET_FRAMEWORK" プロパティの代替方法として、以下の方法が考えられます。

プロジェクトファイルを手動で編集する

Visual Studio でプロジェクトを開き、.csproj または .vcxproj ファイルを手動で編集して、ターゲット .NET フレームワークを設定することができます。

例:.csproj ファイル

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

</Project>

例:.vcxproj ファイル

<Project Default="MyTarget" xmlns="http://schemas.microsoft.com/visualstudio/2008/IntegrationProjects">

  <PropertyGroup>
    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
  </PropertyGroup>

  <ItemGroup>
    <ClCompile Include="mytarget.cpp" />
  </ItemGroup>

  <Import Project="$(MSBuildDefaultTargets)"></Import>

</Project>

dotnet コマンドライン ツールを使用する

dotnet コマンドライン ツールを使用して、プロジェクトのターゲット .NET フレームワークを設定することができます。

dotnet restore
dotnet publish -c Release -f netcoreapp3.1

msbuild コマンドライン ツールを使用する

msbuild コマンドライン ツールを使用して、プロジェクトのターゲット .NET フレームワークを設定することができます。

msbuild myproject.csproj /p:TargetFramework=netcoreapp3.1

注意事項

  • dotnet および msbuild コマンドライン ツールを使用するには、それらのツールがインストールされている必要があります。
  • プロジェクトファイルを手動で編集する場合、誤った変更を行うとプロジェクトが破損する可能性があるため、注意が必要です。
  • 上記の代替方法は、CMake を使用しない場合にのみ有効です。

"DOTNET_TARGET_FRAMEWORK" プロパティは、CMake で .NET フレームワークを設定する最も簡単な方法ですが、上記の代替方法も状況に応じて使用することができます。