1

我有一个 .NET Core 6.0 自包含应用程序(不是单个文件部署)。

我的 app.runtimeconfig.json 配置文件包含以下设置:

"runtimeOptions": {
        "additionalProbingPaths": [
        "lib",
        "Lib"
        ],

这是因为我想将 dll 探测重定向到子文件夹以避免自包含应用程序在其根目录上生成的混乱。
这样我的根目录只包含这些文件:

  • 应用程序
  • 应用程序.dll
  • app.runtimeconfig.json
  • 应用程序.deps.json
  • hostfxr.dll
  • 主机策略.dll

所有运行时依赖项都在“lib”文件夹中。

使用这种配置,应用程序在任何情况下都能完美运行,但有一个非常相关的例外:如果我在 Windows 启动期间启动它,它会失败。
我认为这对于错误描述而言并不重要,但我使用 HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 中的注册表项启动程序。

我启用了 .NET 跟踪并比较了成功启动的跟踪(双击可执行文件)和不成功的跟踪(使用注册表项自动启动)。

这些是结果:

双击启动成功:

运行时配置 [D:\App\App.runtimeconfig.json] 有效=[1]
按照配置文件 [D:\App\App.runtimeconfig.json] 作为独立应用程序执行

自动运行启动失败:

运行时配置 [D:\App\App.runtimeconfig.json] 有效=[1]
忽略额外的探测路径库,因为它不存在。
根据配置文件 [D:\App\App.runtimeconfig.json] 作为独立应用程序执行

如您所见,如果应用程序在 Windows 启动期间运行,则运行时无法找到额外的探测路径。

这两个跟踪文件在此之前是相同的,然后,由于缺少额外的探测路径,导致在失败的尝试期间找不到所有运行时 dll 文件。

在 Windows 10 (x64) 上测试

4

1 回答 1

0

感谢 panagiotis-kanavos,我了解到问题与“lib”相对路径分辨率有关。
从注册表执行并不意味着工作目录与可执行文件相同,因此相对路径解析无法成功。

我解决了将自动运行功能从注册表移动到在 %AppData%\Microsoft\Windows\Start Menu\Programs\Startup 中创建的正确 Windows 快捷方式的问题。由于使用普通快捷方式我可以定义正确的工作目录,因此执行和相对路径解析现在成功了。

于 2022-01-28T09:13:41.623 回答