如何在Ubuntu 22.04上安装dotnet Core 3.1运行时?

我有两个安装了Dotnet 6.0的Ubuntu 22.04系统。那个从旧版本的Ubuntu连续升级而来的系统可以正常运行我的Dotnet Core 3.1应用程序,因为它仍然拥有旧版本的运行时(以及不再适用于22.04的libssl1.1)。

运行在WSL(即Windows下的Ubuntu)中的系统具有从packages.ubuntu.com/focus下载的dotnet6.0包、libssl1.1,以及来自microsoft的aspnetcore-runtime-3.1。

但是,dotnet --info:

.NET SDK (reflecting any global.json):
 Version:   6.0.108
 Commit:    4e3a463d2b

Runtime Environment:
 OS Name:     ubuntu
 OS Version:  22.04
 OS Platform: Linux
 RID:         ubuntu.22.04-x64
 Base Path:   /usr/lib/dotnet/dotnet6-6.0.108/sdk/6.0.108/

global.json file:
  Not found

Host:
  Version:      6.0.8
  Architecture: x64
  Commit:       55fb7ef977

.NET SDKs installed:
  6.0.108 [/usr/lib/dotnet/dotnet6-6.0.108/sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 6.0.8 [/usr/lib/dotnet/dotnet6-6.0.108/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 6.0.8 [/usr/lib/dotnet/dotnet6-6.0.108/shared/Microsoft.NETCore.App]

即使运行时显示在/usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.28/位置

1只有在Ubuntu 22.04上支持dotnet 6+ - algorix
@algorix 这绝对不是真的。 - Auspex
3个回答

原来Ubuntu的SDK和运行时位置选择与微软的不兼容。所以,有一个dotnet6软件包可以拉入所有软件包,但你真正想要的是微软的!关键是首先创建一个apt偏好文件:
derbro@L21PS773:~$ cat /etc/apt/preferences.d/dotnet.pref
Package: *                                                                                                                                                                                  
Pin: origin "packages.microsoft.com"                                                                                                                                                        
Pin-Priority: 1001                                                                                                                                                                          

(这是我工作系统已经根据安装Dotnet 6.0的指示所拥有的,详见为什么这些方法都无法在22.04(Jammy Jellyfish)上安装.Net Core SDK和运行时?。实际上,在这个WSL安装中,我没有遇到让Dotnet 6正常工作的问题,只是无法找到3.1运行时)
现在,请按照微软的说明安装3.1运行时或SDK:
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
sudo apt-get update
sudo apt-get install -y aspnetcore-runtime-6.0
#or
sudo apt-get install -y dotnet-sdk-3.1

(如果由于缺少libssl1.1而导致安装失败,您需要从https://packages.ubuntu.com/focal/libssl1.1获取该文件,并使用dpkg --install命令进行安装。)
然后升级您的MS源:
wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
sudo apt-get update

安装(或重新安装)dotnet6
sudo apt install dotnet6

我无法在Ubuntu 22上使用任何软件包仓库使3.1版本正常工作。 通过微软的软件包仓库,我能找到该软件包,但是它无法获取所需的依赖项。
sudo apt-get install dotnet-sdk-3.1
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies.
 dotnet-sdk-3.1 : Depends: dotnet-targeting-pack-3.1 (>= 3.1.0) but it is not installable
                  Depends: netstandard-targeting-pack-2.1 (>= 2.1.0)
                  Depends: aspnetcore-targeting-pack-3.1 (>= 3.1.10) but it is not installable
E: Unable to correct problems, you have held broken packages

我觉得这是因为3.1版本现在不再受支持。
看起来有效的方法是卸载所有dotnet包。
sudo apt remove dotnet*

然后直接从https://dotnet.microsoft.com/en-us/download/dotnet/3.1获取二进制文件。
当您点击与您的架构相对应的链接时,会显示以下说明:
通过在~/Downloads(或您存放tar.gz文件的任何位置)运行此命令进行安装。
mkdir -p $HOME/dotnet && tar zxf dotnet-sdk-3.1.426-linux-x64.tar.gz -C $HOME/dotnet

然后将以下行添加到您的bash启动文件(.profile/.bashrc/whatever)中
export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$HOME/dotnet

你需要在任何打开的终端中重新加载你的配置文件,然后运行dotnet run,它会再次执行相应的操作。

1奇怪的是它可以找到SDK,但找不到其他软件包,但我认为如果它们已经停止支持,它们可能已经被删除了。如果它们在二进制文件中仍然可用,这是正确的方法。这也解决了与固定版本有关的问题,固定版本总是非常麻烦! - Auspex
@Auspex 是的,我很惊讶你能看到这个软件包却无法安装它,感觉有点毫无意义,但也许还有一种有用的方式——我的软件包理解非常有限,可能你仍然可以从软件包仓库中获取到3.1版本的一些有用部分。我现在并不是开发者,所以不太使用dotnet,但会在我的(Haskell)开发环境中运行一些服务。 - JonnyRaa

在文件/etc/ssl/openssl.cnf中,注释掉这行代码。
#openssl_conf = openssl_init

所以,尝试安装SDK 3.1吧。
sudo wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo rm packages-microsoft-prod.deb
sudo apt-get update
sudo apt-get install -y dotnet-sdk-3.1

现在,去终端并输入以下命令:

dotnet --info

如果一切正常,您将看到 dotnet 3.1 的安装路径。

我认为你在尝试解决两个不同的问题。首先,一个openssl问题(无论如何,我的openssl.cnf没有被注释掉,但是dotnet-sdk-3.1依赖于libssl1.1,而你的解决方案并没有提供这个);其次是3.1版本的SDK。然而,我遇到的问题是我已经通过apt安装了dotnet-sdk-3.1,但它仍然无法工作,因为你将会有Ubuntu的6.0版本,这是不兼容的(也许Ubuntu现在已经修复了这个问题)。否则,你的答案是我的一个子集。 - Auspex
对我来说,这个解决方案很有效。我按照这些步骤进行操作,dotnet 3.1和6.0成功在Ubuntu 22.04上运行。 - Paulo