2024-09-04 (水)
[C#] sln を使用せず csproj でビルドの依存関係を設定する
csproj で別プロジェクトを参照して、ビルドのみ実行するように依存関係を設定する方法です。
ビルドのみ実行するため、別プロジェクトのクラスを使用できませんし、ファイルもビルド出力しません。
通常はソリューションで設定することが多いと思いますが、sln を使用せずに設定します。
環境
- .NET 8.0.8 (SDK 8.0.400)
- C# 12.0
- Visual Studio 2022 Version 17.11.2
- Windows 11 Pro 23H2 22631.4037
前提
プロジェクト依存関係は、以下のようになっている前提で説明します。
Main.csproj(C# ConsoleExe)CsLibrary1.csproj(C# Library)CsLibrary2.csproj(C# Library)CsConsole1.csproj(C# ConsoleExe)
CppLibrary1.vcxproj(C++ Library)
csproj の設定方法
Main.csproj に設定する記述例です。
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<!-- C# プロジェクトの参照 -->
<ProjectReference Include="..\CsLibrary1\CsLibrary1.csproj">
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
<SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties>
<Private>false</Private>
<ExcludeAssets>all</ExcludeAssets>
</ProjectReference>
<!-- C++ プロジェクトの参照 -->
<ProjectReference Include="..\CppLibrary1\CppLibrary1.vcxproj">
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
</ItemGroup>
</Project>
各設定値の説明
以下は C# プロジェクト参照における動作を説明します。
ReferenceOutputAssembly
CsLibrary1.dll,CsLibrary2.dllが、Mainプロジェクトにビルド出力されなくなります。CsLibrary1,CsLibrary2,CsConsole1にあるクラスなどを使用することが出来なくなります。
💡 この設定のみでは CsConsole1.exe がビルド出力されてしまいます。
また CsLibrary1, CsLibrary2, CsConsole1 で CopyToOutputDirectory に設定されているファイルもビルド出力されてしまいます。
SkipGetTargetFrameworkProperties
TargetFrameworkを無視するように参照します。- 例えば、
Main.csprojがnet8.0で、CsLibrary1がnet6.0の場合、SkipGetTargetFrameworkPropertiesを設定しないとビルドエラーになります。
Private
CsLibrary1で出力ディレクトリにコピー (CopyToOutputDirectory) に設定されているファイルが、Mainプロジェクトにビルド出力されなくなります。CsLibrary1で<OutputType>Exe</OutputType>なプロジェクトを参照している場合、.exe 群がMainプロジェクトにビルド出力されなくなります。
💡 この設定のみでは CsLibrary2, CsConsole1 のファイルが、Main プロジェクトにビルド出力されてしまいます。<ReferenceOutputAssembly> と組み合わせることで、CsLibrary1, CsLibrary2, CsConsole1 の全てのファイルが出力されなくなります。
ExcludeAssets
💡 この設定は <ReferenceOutputAssembly> と <Private> があれば、不要かも知れません。<ExcludeAssets> のみ設定した場合は、以下のようになります。
CsLibrary2.dllと、CsLibrary2の依存関係(csproj, NuGet)が、Mainプロジェクトにビルド出力されなくなります。
感謝
推移的な依存関係の制御
- https://github.com/dotnet/msbuild/blob/main/documentation/wiki/Controlling-Dependencies-Behavior.md (7cf6609)
ProjectReference
- https://learn.microsoft.com/ja-jp/visualstudio/msbuild/common-msbuild-project-items#projectreference
Issue
関連記事
新着記事