.Net class 构建机器上的库编译错误

.Net class library compilation error on build machine

我有一个 SDK 风格的 .Net class 库,它可以在我的本地机器上正确编译,但是在构建服务器上失败。

.csproj的内容是

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>net35;net40;netstandard1.0</TargetFrameworks>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <Version>1.5.6</Version>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
  </PropertyGroup>

</Project>

显示的错误是: NETSDK1045:当前的 .NET SDK 不支持面向 .NET Standard 4.0。以 .NET Standard 2.1 或更低版本为目标,或者使用支持 .NET Standard 4.0

的 .NET SDK 版本

我在构建服务器上安装了 .NET Core 3.1.113,在本地计算机上安装了 .NET 5。

注意:如果我从 TargetFrameworks 中删除 netstandard1.0,那么两台机器上的构建都会成功。但是我希望我的库也以 .net 标准 1.0 为目标。

我无法理解为什么 v4.0 在构建服务器上被视为 .NET Standard 4.0。谁能告诉我可能是什么问题?

I cannot understand why v4.0 is treated as .NET Standard 4.0 on build server. Can anyone let me know what the problem might be?

这很奇怪,我以前从未见过这个问题。并且没有关于 .NET Standard 4.0 的信息,我不知道为什么 VS 将 v4.0(net framework 4.0) 视为 net standard 4.0。可能是你的服务器环境有问题

请遵循这些:

1) 首先,请使用CMD下的dotnet --list-sdks检查您是否安装了net core 2.1 sdk或任何其他版本。实际上,net core 2.1 sdk 可以支持以前的sdks,包括net standard 1.0。也许你最好安装 net core 2.1 sdk。另外,您可以安装最新的 Net Core 3.1 Sdk.

2)查看系统环境变量,是否有名为MSBuildSDKsPath的变量,如果有,请将其删除。然后,重启。

3)删除构建服务器下的binobj文件夹。另外,我建议你最好使用 Build Tool for VS 在服务器上构建你的项目,而不是 dotnet builddotnet cli不包含net framework的工具。另外,你的项目是multi-targetframeworks,可以构建net corenet standard,而且你还得下载net framework sdk。

太复杂了,你可以安装the Build Tool for VS2019(更像是一个集成了dotnet、net framework、all vs环境的轻量级cmd)。另外,安装Net desktop build toolnet core build tool工作负载,同时安装相关的sdks。

完成后,删除binobj文件夹,在VS命令的构建工具下输入:

msbuild xxx\xxx.csproj -t:clean,restore,build 

从您的 .csproj 文件中删除 以下行:

<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>

这会覆盖 SDK 从 TargetFramework 推断的版本值,这将干扰您对 net3.5 的定义等等 - 您实际上构建了 .NET Framework 4.0 两次,然后覆盖了 netstandard1.0 到 .NET Standard(推断 TargetFrameworkIdentifier)到 4.0。较新版本的 SDK 可能具有不同的推理逻辑,这可能是 3.1 和 5.0 SDK 之间的差异,但这仍然是 csproj 中的错误。

如果您的构建逻辑依赖于项目中定义的 TargetFrameworkVersion,我建议您尝试更改您的构建逻辑 - 在您依赖 [=12= 的现代 csproj 文件中,这非常危险] 和 TargetFrameworks(复数)。您也可以尝试将其移动到一个单独的 <PropertyGroup> 中,条件始终为假(例如 <PropertyGroup Condition="'$(ThisIsToWorkAroundBuildScripts)' == 'True'">