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 パッケージがプロジェクトに追加されます。このパッケージは、ビルド プロセス中に自動的にダウンロードおよびインストールされます。