JsonPatch.Net.dll在Windows pwsh正常运行,Linux环境下报错
问题诊断与修复方案
核心问题分析
Windows环境(pwsh 7.4)下可正常运行的Minimal.ps1脚本,在Linux Docker容器中执行时出现Json.Patch.PatchJsonConverter类型无法解析的错误,且依赖的Json.More.Net、JsonPointer.Net等DLL加载失败,仅Humanizer.Net能正常加载。这本质是Linux与Windows下.NET程序集加载机制的差异,加上手动提取NuGet包时可能遗漏依赖或加载顺序错误导致的。
修复步骤
1. 补全所有依赖DLL
从JsonPatch.Net 3.2.3及其所有依赖NuGet包(Json.More.Net、JsonPointer.Net等)的lib/net8.0目录中,将所有DLL完整复制到脚本的lib目录,确保没有遗漏任何依赖组件。
2. 按依赖顺序显式加载DLL
PowerShell在Linux下不会自动递归解析程序集依赖,需按依赖层级顺序加载所有DLL,修改脚本如下:
# 按依赖优先级加载所有必需DLL $requiredDlls = @( "$PSScriptRoot/lib/Json.More.Net.dll", "$PSScriptRoot/lib/JsonPointer.Net.dll", "$PSScriptRoot/lib/JsonPatch.Net.dll", "$PSScriptRoot/lib/Humanizer.Net.dll" ) foreach ($dll in $requiredDlls) { Add-Type -LiteralPath $dll } $ErrorActionPreference = "Stop" [System.Text.Json.JsonSerializer]::Deserialize[Json.Patch.JsonPatch]("[]")
3. 验证DLL跨平台兼容性
确认所有提取的DLL均为net8.0跨平台版本,无Windows专属编译文件。可在容器内运行dotnet dump inspect [DLL路径]查看目标框架信息。
4. 改用NuGet自动还原依赖(推荐)
在Docker容器内通过dotnet add package JsonPatch.Net --version 3.2.3自动安装所有依赖,脚本中直接引用NuGet默认安装路径的DLL,避免手动提取出错:
# 引用NuGet自动安装的依赖DLL $nugetRoot = "$HOME/.nuget/packages" $jsonMoreDll = "$nugetRoot/json.more.net/3.2.0/lib/net8.0/Json.More.Net.dll" $jsonPointerDll = "$nugetRoot/jsonpointer.net/3.2.0/lib/net8.0/JsonPointer.Net.dll" $jsonPatchDll = "$nugetRoot/jsonpatch.net/3.2.3/lib/net8.0/JsonPatch.Net.dll" Add-Type -LiteralPath $jsonMoreDll, $jsonPointerDll, $jsonPatchDll $ErrorActionPreference = "Stop" [System.Text.Json.JsonSerializer]::Deserialize[Json.Patch.JsonPatch]("[]")
内容的提问来源于stack exchange,提问作者Araxor
相关产品推荐
相关产品推荐

