#c# #.net #msbuild
Вопрос:
У меня есть общая библиотека, которая должна использоваться как проектами .Net 5, так и проектами .Net Framework 4.8. Из-за других сложностей в процессе построения, то невозможно, чтобы просто иметь несколько TargetFrameworks
определенными в общей библиотеке, так что я хочу использовать MSBuild
свойство динамически устанавливается, если общая библиотека должна быть ориентирована .Объем 5 или .Чистая Рамках 4.8. Этот подход работает, когда я передаю флаг собственность с помощью MSBuild С ( /p:Net48=True
), но не когда я определяю свойства MSBuild непосредственно в файле csproj.
Ниже приведен простой пример того, что я пытаюсь сделать:
Проект А:
lt;Project Sdk="Microsoft.NET.Sdk"gt; lt;PropertyGroupgt; lt;TargetFrameworkgt;net5.0lt;/TargetFrameworkgt; lt;/PropertyGroupgt; lt;ItemGroupgt; lt;ProjectReference Include="..CC.csproj" /gt; lt;/ItemGroupgt; lt;/Projectgt;
Проект В:
lt;Project Sdk="Microsoft.NET.Sdk"gt; lt;PropertyGroupgt; lt;TargetFrameworkgt;net48lt;/TargetFrameworkgt; lt;/PropertyGroupgt; lt;PropertyGroupgt; lt;Net48gt;Truelt;/Net48gt; lt;/PropertyGroupgt; lt;ItemGroupgt; lt;ProjectReference Include="..CC.csproj" /gt; lt;/ItemGroupgt; lt;/Projectgt;
Проект C (Общая библиотека):
lt;Project Sdk="Microsoft.NET.Sdk"gt; lt;PropertyGroupgt; lt;TargetFramework Condition="'$(Net48)' == ''"gt;net5.0lt;/TargetFrameworkgt; lt;TargetFramework Condition="'$(Net48)' != ''"gt;net48lt;/TargetFrameworkgt; lt;/PropertyGroupgt; lt;/Projectgt;
Запуск dotnet build B.csproj /p:Net48=True
создает проект при dotnet build B.csproj
сбое. Разве определение свойства lt;Net48gt;Truelt;/Net48gt;
не должно оказывать такое же влияние, как установка флага?
Ответ №1:
Разве определение свойства True не должно оказывать такое же влияние, как установка флага?
Нет свойства, установленные в проекте не распространяются на проекты, на которые ссылается проект, поэтому, когда вы выполняете dotnet build B.csproj
свойство Net48
не определено в Project C. Однако, набор свойств в командной строке применяются глобально для всех проектов (и имеют приоритет в отношении имущества, значения, заданные статически в файле проекта) поэтому, установив его в командной строке работает.
На самом деле в этом случае вам не нужна какая-либо специальная условная логика, поскольку проекты в стиле SDK поддерживают создание нескольких целевых платформ.
Просто измените свой проект C на следующий:
lt;Project Sdk="Microsoft.NET.Sdk"gt; lt;PropertyGroupgt; lt;!-- See https://docs.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#targetframeworks --gt; lt;TargetFrameworksgt;net48;net5.0lt;/TargetFrameworksgt; lt;/PropertyGroupgt; lt;Target Name="DisplayTargetInfo" BeforeTargets="Build"gt; lt;Message Importance="high" Text="$(MSBuildProjectName) TargetFramework = $(TargetFramework)" /gt; lt;/Targetgt; lt;/Projectgt;