dotnetpublish --self-contained -> 运行应用程序仍然要求安装.net

问题描述 投票:0回答:2

正如主题所暗示的,即使使用“--self-contained true”(并使用特定的 -r 选项)进行发布,运行时仍然会要求缺少 .net 安装。

我现在已经研究了这个主题,在我看来,几乎所有相关的 dll 都应该位于输出文件夹中,但由于某种原因,尝试发现这些 dll 的机制没有找到它们。这可以在按照此处说明应用的跟踪日志中看到:

https://github.com/dotnet/runtime/blob/main/docs/design/features/host-tracing.md

以下是跟踪的一部分:

Resolving FX directory, name 'Microsoft.NETCore.App' version '6.0.0'
Multilevel lookup is true
Searching FX directory in [C:\Program Files\My Application]
Attempting FX roll forward starting from version='[6.0.0]', apply_patches=1, version_compatibility_range=minor, roll_to_highest_version=0, prefer_release=1
'Roll forward' enabled with version_compatibility_range [minor]. Looking for the lowest release greater than or equal version to [6.0.0]
No match greater than or equal to [6.0.0] found.
'Roll forward' enabled with version_compatibility_range [minor]. Looking for the lowest release/pre-release greater than or equal version to [6.0.0]
No match greater than or equal to [6.0.0] found.
Framework reference didn't resolve to any available version.
Searching FX directory in [C:\Program Files\dotnet]

我什至尝试将相应的 C:\Program Files\dotnet\shared... 中存在的所有相同文件复制到我的发布文件夹,但没有更好的结果。

我的主要问题是.NET 查找 dll 的机制是什么?从发布文件夹。为什么它在那里找不到它们,但在 C:\Program Files\dotnet\shared...

中找到它们
.net .net-core
2个回答
5
投票

很明显我确实花了更多时间研究这个。

在我看来,发生上述情况的原因之一是我使用 dotnetpublish --no-build 选项,并使用 msbuild 单独构建。我没有确凿的证据证明这一点,但当我浏览大量不同的谷歌搜索结果时,有人提出了类似的建议。

但是尽管如此,我还是设法让部署正常工作(这意味着不需要全局 .NET 安装)。解决方法是从发布输出文件夹中删除这两个文件:

  • MyApp.runtimeconfig.json
  • MyApp.deps.json

此后,运行时将寻找独立的 .NET 程序集。实际上在这篇文章中提到,*.runtimeconfig.json 仅适用于框架相关的。仍然是一个谜的是为什么 dotnetpublish 将该文件复制到输出文件夹中。但正如上面提到的,我怀疑 --no-build 选项有某种相关性。


0
投票

当我升级到.NET 8.0时,我也遇到了这个问题。如果您使用

--no-build
参数,您还应该在
--self-contained
上指定
dotnet build
。这在 .NET 8.0 之后尤其重要,它引入了一项重大更改,默认情况下运行时特定的应用程序不再是独立的。

重大变更的链接: https://learn.microsoft.com/en-us/dotnet/core/compatibility/sdk/8.0/runtimespecific-app-default

总结:

dotnet build --self-contained
会将您的可执行文件构建为独立的应用程序

dotnet publish --self-contained
会将 .NET Core 运行时文件复制到您的发布目录(例如“Microsoft.AspNetCore.dll”、“System.Core.dll”、“System.Console.dll”等)

您需要两者都有一个可运行的独立应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.