DLL 可在 Windows pwsh 上运行,但不能在 Linux 上运行?

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

我有以下脚本,名为

Minimal.ps1
:

Add-Type -LiteralPath "$PSScriptRoot/lib/JsonPatch.Net.dll"
$ErrorActionPreference = "Stop"
[System.Text.Json.JsonSerializer]::Deserialize[Json.Patch.JsonPatch]("[]")

在我拥有的

lib
目录中,从
JsonPatch.Net 3.2.3 Nuget包
中提取了lib/net8.0/的内容。

在 Windows (pwsh 7.4) 上,该脚本有效:

$ pwsh ./Minimal.ps1
Operations
----------
{}

当我尝试在 Linux 上的 docker 中运行相同的脚本时,它失败了:

$ docker run --rm -it -v .:/test -w /test mcr.microsoft.com/dotnet/sdk:8.0.404 /usr/bin/pwsh ./Minimal.ps1
MethodInvocationException: /test/Minimal.ps1:6
Line |
   6 |  [System.Text.Json.JsonSerializer]::Deserialize[Json.Patch.JsonPatch]( …
     |  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Exception calling "Deserialize" with "1" argument(s): "Could not resolve type 'Json.Patch.PatchJsonConverter' in assembly 'JsonPatch.Net, Version=3.0.0.0, Culture=neutral,
     | PublicKeyToken=17ed63f672b0e278'."

我尝试显式创建

PatchJsonConverter
的实例,但它返回了相同的错误(无法解析类型)。

我看到

JsonPatch.Net
依赖于
Json.More.Net
JsonPointer.Net
Humanizer.Net

当尝试使用

Add-Type
在 Linux 上加载这些 dll 时,我会收到这样的错误,除了正确加载的
Humanizer.Net
之外。

  Add-Type -Verbose -LiteralPath "$PSScriptRoot/lib/Json.More.dll"
     |  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Could not load file or assembly 'Json.More, Version=2.0.0.0, Culture=neutral, PublicKeyToken=17ed63f672b0e278'.
linux powershell powershell-core json-patch powershell-7.4
1个回答
0
投票

经过一些测试,问题似乎发生在

mcr.microsoft.com/dotnet/sdk:8.0.404
映像(以及我测试的所有其他 dotnet 8 映像)中安装的 PowerShell 版本上。确切的 PowerShell 版本是 7.4.6。

我不确定问题的发生是否是由于 PowerShell 版本或其在映像中的安装方式所致,但在 dotnet 9 映像中或在 Debian bookworm 容器中手动安装 PowerShell 时,一切都按预期工作。

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