[C#] sln を使用せず csproj でビルドの依存関係を設定する

2024-09-04 (水)

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, CsConsole1CopyToOutputDirectory に設定されているファイルもビルド出力されてしまいます。

SkipGetTargetFrameworkProperties

  • TargetFramework を無視するように参照します。
  • 例えば、Main.csprojnet8.0 で、CsLibrary1net6.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 プロジェクトにビルド出力されなくなります。

感謝

推移的な依存関係の制御

ProjectReference

Issue

2024-09-04 (水)