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

问题描述

我有一个 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>

显示错误是: 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。谁能告诉我可能是什么问题?

解决方法

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

<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>

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

如果您的构建逻辑依赖于在项目中定义的 TargetFrameworkIdentifier,我建议您尝试更改构建逻辑 - 在依赖于 TargetFrameworkVersion 的现代 csproj 文件中,这是非常危险的,并且TargetFramework(复数)。您也可以尝试将其移动到带有始终为假条件的单独 TargetFrameworks 中(例如 <PropertyGroup>

,

我不明白为什么 v4.0 在构建时被视为 .NET Standard 4.0 服务器。谁能告诉我可能是什么问题?

这很奇怪,我以前从未见过这个问题。并且没有关于 .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 可以支持以前的 sdk,包括 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 corenet standard,而且你必须下载net framework sdk。

那太复杂了,你可以安装the Build Tool for VS2019(更可能是一个轻量级的cmd,它集成了dotnet、net framework、all vs environment)。另外,安装Net桌面构建工具net核心构建工具工作负载,同时安装相关的sdks。

enter image description here

完成后,删除 binobj 文件夹,在 Build Tool for VS 命令下键入:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...