在自定义生成项目中,可能会使用两种可能的MSBuild框架。一种是用.NET Core构建的,一种是用.NET Framework构建的Visual Studio MSBuild。后者总是在从Visual Studio生成时运行,而前者由命令行生成脚本使用。由于事实,Visual Studio是我们的首选IDE,并且当前仅支持.NET Framework MSBuild,因此我们不能放弃对其的支持(向纯.NET Core MSBuild的迁移会破坏IntelliSense,重构和许多其他VS优点)。
代码库中的项目之一是C++ vcxproj
,它只能在Windows上使用.NET Framework MSBuild构建,而在其他平台上则使用make
。 C++项目是某些C#项目的依赖项,应该在它们基于标准MSBuild逻辑进行构建时进行构建。
当前,它通过以下方式包含在C#项目中:
<ProjectReference Condition="$(SolutionFileName) == 'Solution.sln'" Include="nativeproject\nativeproject.vcxproj" />
当从Visual Studio构建项目时,条件始终为true(VS填充此值),而通过在项目级别调用MSBuild并分别构建vcxproj从构建脚本进行构建时,条件将为false。但是,它没有提供基于.NET Core和.NET Framework MSBuild之间条件区分的通用解决方案。
不幸的是,Visual Studio支持.NET Core MSBuild并将其用于vcxproj构建的最佳选择仍然遥遥无期。
最佳答案
How to find at runtime with well known properties which build of MSBuild is running - .NET Core or .NET Framework.
尝试使用this document中的
$(MSBuildRuntimeType)
。我的测试:
对于其中有这样的自定义目标的
test.csproj
: <Target Name="Test" AfterTargets="build">
<Message Text="value is $(MSBuildRuntimeType)" Importance="high"/>
</Target>
当我使用
msbuild test.csproj
时,其值为完整(.net fx msbuild,与VS中的结果相同)当我使用
dotnet build test.csproj
(.net core SDK中包含的.net core msbuild)时,其值为 Core 。因此,如果您尝试获取一个属性来确定使用哪种类型的msbuild,这似乎可以满足您的需求。希望能有所帮助,如果我误解了任何内容,请随时纠正我。
关于c# - 如何在运行时查找具有已知属性的MSBuild的哪个运行版本-.NET Core或.NET Framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59254872/