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
関連記事
新着記事