CMake: 個別.NET参照の扱い方もお手の物!VS_DOTNET_REFERENCES_COPY_LOCALと.NET プロパティファイルの合わせ技


"VS_DOTNET_REFERENCES_COPY_LOCAL" は、CMake の "Properties: Targets" におけるターゲット プロパティであり、.NET ヒント参照をビルド出力ディレクトリにコピーするかどうかを制御します。このプロパティは、Visual Studio で .NET プロジェクトを生成する場合にのみ使用されます。

デフォルト値

デフォルトでは、"VS_DOTNET_REFERENCES_COPY_LOCAL" は ON に設定されており、すべての .NET ヒント参照がビルド出力ディレクトリにコピーされます。

使用方法

"VS_DOTNET_REFERENCES_COPY_LOCAL" を設定するには、以下のいずれかの方法を使用します。

  • ターゲット プロパティを設定する:
set_target_properties(mytarget PROPERTIES VS_DOTNET_REFERENCES_COPY_LOCAL OFF)
  • ターゲット プロパティ ファイルを使用する:
target_properties(mytarget PROPERTIES
  VS_DOTNET_REFERENCES_COPY_LOCAL OFF)

効果

"VS_DOTNET_REFERENCES_COPY_LOCAL" が OFF に設定されている場合、.NET ヒント参照はビルド出力ディレクトリにコピーされません。これは、開発者が参照を手動で配置する必要があることを意味します。

ヒント

  • .NET プロジェクト ファイルでは、"Copy Local" プロパティを使用して、個々の .NET 参照の コピー動作を制御できます。
  • .NET ヒント参照は、通常、.NET Framework または .NET Core などのシステムレベルの参照です。これらの参照は、通常、ビルド出力ディレクトリにコピーする必要はありません。

以下の例では、"mytarget" ターゲットの "VS_DOTNET_REFERENCES_COPY_LOCAL" プロパティを OFF に設定し、.NET ヒント参照を手動で配置する必要があることを示します。

target_sources(mytarget PRIVATE mycode.cpp)
target_link_libraries(mytarget mylib)
set_target_properties(mytarget PROPERTIES VS_DOTNET_REFERENCES_COPY_LOCAL OFF)

この例では、開発者は mylib.dll アセンブリを手動で mytarget.exe の出力ディレクトリに配置する必要があります。



例 1: ターゲット プロパティを設定する

cmake_minimum_required(VERSION 3.8)

project(myproject)

add_executable(mytarget mycode.cpp)
target_link_libraries(mytarget mylib)

set_target_properties(mytarget PROPERTIES VS_DOTNET_REFERENCES_COPY_LOCAL OFF)

例 2: ターゲット プロパティ ファイルを使用する

この例では、"mytarget.props" というターゲット プロパティ ファイルを使用して、"mytarget" ターゲットの "VS_DOTNET_REFERENCES_COPY_LOCAL" プロパティを OFF に設定します。

cmake_minimum_required(VERSION 3.8)

project(myproject)

add_executable(mytarget mycode.cpp)
target_link_libraries(mytarget mylib)

set_property(TARGET mytarget PROPERTY VS_DOTNET_REFERENCES_COPY_LOCAL OFF)

target_sources(mytarget PRIVATE mycode.cpp)
target_link_libraries(mytarget mylib)

configure_file(mytarget.props COPY ONLY)

例 3: 個々の .NET 参照の "Copy Local" プロパティを制御する

この例では、".NET Framework" アセンブリの "Copy Local" プロパティを TRUE に設定し、".NET Core" アセンブリの "Copy Local" プロパティを FALSE に設定する方法を示します。

cmake_minimum_required(VERSION 3.8)

project(myproject)

add_executable(mytarget mycode.cpp)

target_link_libraries(mytarget
  "System;System.Windows.Forms" # .NET Framework アセンブリ
  "Newtonsoft.Json" # .NET Core アセンブリ)

set_target_properties(mytarget PROPERTIES
  VS_DOTNET_REFERENCE_SYSTEM_COPY_LOCAL TRUE
  VS_DOTNET_REFERENCE_NEWTONSOFT_JSON_COPY_LOCAL FALSE)

これらの例は、"VS_DOTNET_REFERENCES_COPY_LOCAL" プロパティをさまざまな方法で使用する方法を示しています。具体的なニーズに合わせて、これらの例を調整してください。

  • .NET プロジェクト ファイルでは、"Copy Local" プロパティを使用して、個々の .NET 参照の コピー動作を制御できます。
  • .NET ヒント参照は、通常、.NET Framework または .NET Core などのシステムレベルの参照です。これらの参照は、通常、ビルド出力ディレクトリにコピーする必要はありません。
  • これらの例では、Visual Studio 2019 以降を使用していることを前提としています。


代替方法 1: .NET プロジェクト ファイルを使用する

.NET プロジェクト ファイルでは、"Copy Local" プロパティを使用して、個々の .NET 参照の コピー動作を制御できます。この方法は、"VS_DOTNET_REFERENCES_COPY_LOCAL" プロパティよりも詳細な制御を提供します。

<Project>
  <PropertyGroup>
    <TargetFramework>net461</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Windows.Forms">
      <CopyLocal>True</CopyLocal>
    </Reference>
    <Reference Include="Newtonsoft.Json">
      <CopyLocal>False</CopyLocal>
    </Reference>
  </ItemGroup>
</Project>

この例では、".NET Framework" アセンブリはビルド出力ディレクトリにコピーされますが、".NET Core" アセンブリはコピーされません。

代替方法 2: 手動で参照を配置する

"VS_DOTNET_REFERENCES_COPY_LOCAL" プロパティを OFF に設定し、.NET ヒント参照を手動で配置することもできます。この方法は、より細かい制御を提供しますが、手動で参照を配置する必要があるため、より煩雑になります。

cmake_minimum_required(VERSION 3.8)

project(myproject)

add_executable(mytarget mycode.cpp)
target_link_libraries(mytarget mylib)

set_target_properties(mytarget PROPERTIES VS_DOTNET_REFERENCES_COPY_LOCAL OFF)

# 手動で参照を配置する
add_custom_command(TARGET mytarget PRE_BUILD
  COMMAND ${CMAKE_CURRENT_BINARY_DIR}/mylib.dll ${CMAKE_CURRENT_BINARY_DIR})

この例では、"mylib.dll" アセンブリを手動で mytarget.exe の出力ディレクトリに配置するカスタム コマンドが追加されます。

代替方法 3: NuGet パッケージを使用する

NuGet パッケージは、.NET 開発者が共有および再利用できるコンポーネントのコレクションです。NuGet パッケージを使用すると、.NET ヒント参照をビルド出力ディレクトリにコピーする必要がなくなります。

<Project>
  <PropertyGroup>
    <TargetFramework>net461</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" />
  </ItemGroup>
</Project>

この例では、"Newtonsoft.Json" NuGet パッケージがプロジェクトに追加されます。このパッケージは、ビルド プロセス中に自動的にダウンロードおよびインストールされます。