我有一個共享庫,需要由 .Net 5 和 .Net Framework 4.8 專案使用。由于構建程序中的其他復雜性,不可能TargetFrameworks在共享庫中簡單地定義多個,所以我想使用一個MSBuild屬性來動態設定共享庫是否應該面向 .Net 5 或 .Net Framework 4.8。當我通過 MSBuild ( /p:Net48=True)傳遞標志屬性時,此方法有效,但當我直接在 csproj 檔案中定義 MSBuild 屬性時則無效。
下面是我正在嘗試做的一個簡單的例子:
專案A:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\C\C.csproj" />
</ItemGroup>
</Project>
專案乙:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<Net48>True</Net48>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\C\C.csproj" />
</ItemGroup>
</Project>
專案 C(共享庫):
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework Condition="'$(Net48)' == ''">net5.0</TargetFramework>
<TargetFramework Condition="'$(Net48)' != ''">net48</TargetFramework>
</PropertyGroup>
</Project>
運行dotnet build B.csproj /p:Net48=True會在dotnet build B.csproj失敗時構建專案。屬性定義不應該<Net48>True</Net48>與設定標志具有相同的影響嗎?
uj5u.com熱心網友回復:
屬性定義 True 不應該與設定標志具有相同的影響嗎?
否 - 專案 A 中設定的屬性不會傳播到專案 A 參考的專案,因此當您執行dotnet build B.csproj該屬性時Net48,專案 C 中未定義該屬性。但是,在命令列上設定的屬性全域應用于所有專案(并優先于設定的屬性值)靜態在專案檔案中)這就是為什么在命令列上設定它有效。
在這種情況下,您實際上不需要任何特殊的條件邏輯,因為 SDK 樣式的專案支持為多個目標框架構建。
只需將您的專案 C 更改為以下內容:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- See https://docs.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#targetframeworks -->
<TargetFrameworks>net48;net5.0</TargetFrameworks>
</PropertyGroup>
<Target Name="DisplayTargetInfo" BeforeTargets="Build">
<Message Importance="high" Text="$(MSBuildProjectName) TargetFramework = $(TargetFramework)" />
</Target>
</Project>
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/351638.html
