You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

相同代码在PowerShell模块与直接脚本中表现不同的问题求助

PowerShell中Newtonsoft.Json版本绑定重定向失效的解决办法

兄弟,我太懂你这种在PowerShell里踩程序集版本重定向坑的痛苦了!普通.NET项目里靠app.config就能轻松搞定的版本兼容问题,到PowerShell里直接罢工,简直离谱。别着急,咱们一步步来解决:

为什么PowerShell里重定向会失效?

PowerShell有自己的默认配置文件(比如powershell.exe.config或者pwsh.exe.config),它不会自动读取你项目里的app.config。所以你之前在其他解决方案里用的配置,在PowerShell的运行环境里根本没生效。

两种靠谱的解决方法

方法一:手动给当前PowerShell会话指定绑定重定向配置

这种方法最稳妥,相当于给当前PowerShell进程临时加一个专属的配置文件:

  1. 先在脚本里生成一个临时的配置文件,把你的版本重定向规则写进去:
# 定义配置文件路径,比如放在当前脚本目录下
$configPath = Join-Path $PWD.Path "ps_newtonsoft_redirect.config"

# 写入绑定重定向配置(注意公钥Token要和你的Newtonsoft.Json一致,默认是30ad4fe6b2a6aeed)
@"
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <!-- 把6.0.0.0到8.0.0.0的版本都重定向到9.0.1.0 -->
        <bindingRedirect oldVersion="6.0.0.0-8.0.0.0" newVersion="9.0.1.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
"@ | Out-File -FilePath $configPath -Encoding utf8
  1. 让当前PowerShell的AppDomain加载这个配置文件:
[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $configPath)
  1. 现在再加载你的目标DLL,重定向就会生效了:
Add-Type -Path "你的依赖DLL路径"

方法二:先手动加载新版本的Newtonsoft.Json

如果你的新版本Newtonsoft.Json和旧版本是向后兼容的,可以先把高版本的DLL加载到PowerShell会话里,CLR会自动用已加载的版本来满足旧版本的依赖请求:

# 先加载9.0.1.0版本的Newtonsoft.Json
Add-Type -Path "你的Newtonsoft.Json.9.0.1.0.dll路径"

# 再加载依赖旧版本的目标DLL
Add-Type -Path "你的依赖DLL路径"

注意事项

  • 一定要确认publicKeyToken的正确性,Newtonsoft.Json官方版本的公钥Token是30ad4fe6b2a6aeed,如果你的是自定义编译的版本,这个值会不一样,重定向就不会生效。
  • 如果是PowerShell 7+(基于.NET Core/.NET 5+),加载传统.NET Framework的DLL时,方法一依然有效;如果是.NET Core的DLL,需要用.runtimeconfig.json来配置依赖项,原理类似。

内容的提问来源于stack exchange,提问作者Choub890

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:41:45