dotnet发布后,其他探测路径不受尊重?

Mic*_*tum 9 .net .net-core .net-core-2.0

我在Windows上使用dotnet 2.1.4.dotnet --info显示:

.NET Command Line Tools (2.1.4)

Product Information:
 Version:            2.1.4
 Commit SHA-1 hash:  5e8add2190

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.16299
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\2.1.4\

Microsoft .NET Core Shared Framework Host

  Version  : 2.0.5
  Build    : 17373eb129b3b05aa18ece963f8795d65ef8ea54
Run Code Online (Sandbox Code Playgroud)

我正在使用dotnet发布来创建平台的输出:

dotnet publish ..\src\ChestnutDS.Host\ChestnutDS.Host.csproj
     -c Release -o ..\..\published\win-x64
     --self-contained -r win-x64 -v n
Run Code Online (Sandbox Code Playgroud)

这给了我在323文件的文件夹中所需的(和工作)输出.

发布文件夹

现在,我想要做的是将所有大部分文件移动到子文件夹中,例如lib.

将大部分内容移到了lib中

根据我收集的内容,additionalProbingPaths在runtimeconfig.json中设置应该有效:

{
  "runtimeOptions": {
    "additionalProbingPaths": [
      "lib"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

但它抱怨没有找到图书馆:

Error:
  An assembly specified in the application dependencies manifest (ChestnutDS.Host.deps.json) was not found:
    package: 'Microsoft.AspNetCore.Antiforgery', version: '2.0.1'
    path: 'lib/netstandard2.0/Microsoft.AspNetCore.Antiforgery.dll'
Run Code Online (Sandbox Code Playgroud)

尝试将--additionalProbingPath作为命令行参数传递也不起作用,同样的错误.

尝试创建提到的结构并移动文件(lib/netstandard2.0/Microsoft.AspNetCore.Antiforgery.dll)也不起作用.

我错过了什么吗?该功能被删除了吗?它看起来不像,源代码仍然包含它.

Iva*_*uba 0

尝试创建上述结构并移动文件

看起来你已经lib/netstandard2.0/Microsoft.AspNetCore.Antiforgery.dll进入targets/Microsoft.AspNetCore.Antiforgery/2.0.1/runtime并进入"path": "microsoft.aspnetcore.antiforgery/2.0.1"libraies/Microsoft.AspNetCore.Antiforgery/2.0.1。在这种情况下,预期的结构将是<additional probing path>/Microsoft.AspNetCore.Antiforgery/2.0.1/lib/netstandard2.0/Microsoft.AspNetCore.Antiforgery.dll

有两种类型的源文件夹,在其中hostpolicy.dll搜索依赖库(*.dll*.ni.dll):

  • 常规文件夹(文件存在于文件夹的根目录中,“路径”被省略)
  • NuGet 缓存(每个依赖项都有一个特定的子文件夹结构<PackageName>/<Version>/<DllPath>,默认情况下*.deps.json会生成以满足此约定)

在这些文件夹中搜索依赖项:

  • App文件夹(常规文件夹)——App.exe(App.dll)被执行的文件夹;默认为 SCD。
  • Framework 文件夹(常规文件夹)-仅适用于 Framework 相关部署,例如C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.1.4\.
  • 探测路径(NuGet 缓存)。

假设我们有这个App.deps.json(独立部署)

"targets": {
    "runtime.win-x64.Microsoft.NETCore.App/2.0.0": {
        "runtime": {
              "foo/Microsoft.CSharp.dll": {},  // <========
        }
    }
}

"libraries": {
    "runtime.win-x64.Microsoft.NETCore.App/2.0.0": {
      "type": "package",
      "serviceable": true,
      "sha512": "sha512-8jivXDJLuJTxMQuInZaMiD2VbxehFmYAtn2V9mj9juaR5jH54/OBGmGv6SrIUVNqASXB/8dJbce/beIKnOzroQ==",
      "path": "bar", // <========
      "hashPath": "runtime.win-x64.microsoft.netcore.app.2.0.0.nupkg.sha512"
    }
}
Run Code Online (Sandbox Code Playgroud)

首先,hostpolicy.dll将创建所有资产的列表 - 来自每个依赖包的“运行时”和“本机”属性的库。

接下来,它必须创建一个 TPA(可信平台组件)列表,其中包含每个资产的绝对路径。为此,它将首先在应用程序文件夹中进行搜索<app folder path>\Microsoft.CSharp.dll请注意,它将省略此特定文件夹的“路径”)。

一旦找不到 DLL,它就会检查Additional Probing Paths是否有。

这次,由于Additional Probing Path被认为是 NuGet 缓存,因此它期望存在某个子文件夹结构。具体来说,它将获取Package Nameand Versionfrom"libraries"部分,并组合"path"来自"runtime"(或"native") 部分的 DLL 路径。

因此,对于Microsoft.CSharp.dll探测路径将是<Additional Probing Path>/bar/foo/Microsoft.CSharp.dll