Visual studio 生成计算机上的.Net类库编译错误

Visual studio 生成计算机上的.Net类库编译错误,visual-studio,msbuild,.net-standard,csproj,dotnet-sdk,Visual Studio,Msbuild,.net Standard,Csproj,Dotnet Sdk,我有一个SDK风格的.Net类库,可以在本地机器上正确编译,但在构建服务器上失败 .csproj的内容如下 <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net35;net40;netstandard1.0</TargetFrameworks> <TargetFrameworkVersion>v4.0<

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

.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>

net35;net40;netstandard1.0
v4.0
1.5.6
真的
显示的错误为: NETSDK1045:当前的.NET SDK不支持以.NET标准4.0为目标。以.NET标准2.1或更低版本为目标,或使用支持.NET标准4.0的.NET SDK版本

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

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

我无法理解为什么v4.0在构建服务器上被视为.NET标准4.0。有人能告诉我可能是什么问题吗

我无法理解为什么v4.0在构建时被视为.NET标准4.0 服务器。有人能告诉我可能是什么问题吗

这很奇怪,我以前从未见过这个问题。没有关于
.netstandard4.0
的信息,我也不知道为什么VS将
v4.0
(netframework4.0)视为
netstandard4.0
。可能您的服务器环境存在一些问题

请遵循以下步骤:

1)首先,请使用CMD下的
dotnet——列出sdk
,检查您是否安装了
netcore2.1
sdk或任何其他版本。实际上,NETCore2.1SDK可以支持以前的sdk,包括
NETStandard1.0
。也许你最好安装。此外,您还可以安装最新的Net Core 3.1 Sdk

2)检查系统环境变量,并查找是否存在名为
MSBuildSDKsPath
的变量,如果存在,请将其删除。然后,重新启动

3)删除生成服务器下的
bin
obj
文件夹。此外,我建议您最好使用VS构建工具在服务器上构建项目,而不是
dotnet Build
dotnet cli
不包含用于net framework的工具。此外,您的项目是多目标框架,它可以构建
netcore
netstandard
,您还必须下载netframeworksdk

这太复杂了,您可以安装(更可能是一个轻量级cmd,它集成了dotnet、netframework和所有vs环境)。另外,安装Net桌面构建工具Net核心构建工具工作负载,并安装相关SDK

完成后,删除
bin
obj
文件夹,在VS命令的生成工具下键入以下内容:

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

.csproj
文件中删除以下行:

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


如果您的构建逻辑依赖于项目中定义的
TargetFrameworkVersion
,我建议您尝试更改构建逻辑-这对于依赖
TargetFramework
TargetFrameworks
(复数)的现代csproj文件来说是非常危险的。您也可以尝试将其移动到一个单独的带有始终fals条件的
(例如

您是如何在构建机器上构建项目的?Dotnet构建还是其他?请与我们共享生成命令行,好吗?我正在使用visual studio 2019附带的msbuild,并将项目名称作为参数传入。msbuild工具位于:C:\Program Files(x86)\Microsoft Visual Studio\2019\Professional\msbuild\Current\BinSure。如果出现这种情况,您应该在VS安装程序中检查您的VS 2019,对其进行修改,并检查是否在其上安装了所有SDK。如果我删除了该属性,则该属性正常工作。但是,我无法删除它,因为我的构建服务器的配置方式总是在csproj文件中查找。你知道如果目标框架是问题中列出的3,那么它的价值是什么吗?还有它的目的吗?谢谢你,这个答案让我对我试图理解的东西有了很多的了解。我没有将TargetFrameworkVersion移动到始终为false的状态,而是使用了以下内容:v4.0 v3.5 v1.0