PowerShell Desktop运行MimeKit时报System.Buffers 4.0.2.0加载失败怎么办
问题根因
你碰到的是PowerShell Desktop(基于.NET Framework)的经典程序集版本不匹配问题:
- MimeKit 2.15编译时引用的
System.Buffers程序集版本为4.0.2.0,但NuGet上发布的System.Buffers 4.5.1包对应的实际程序集版本为4.0.3.0,版本号不匹配导致.NET Framework默认加载逻辑找不到对应文件 - VSCode中默认使用的PowerShell 7+基于.NET Core/.NET 5+,运行时会自动兼容程序集版本差异,同时运行时自带System.Buffers实现,因此不需要手动导入也可以正常运行
解决方案
方案1:在脚本内添加程序集绑定重定向逻辑(推荐,无全局修改)
在你的Add-Type代码前添加以下代码,当运行时查找4.0.2.0版本的System.Buffers时,直接返回你本地已有的4.5.1版本程序集:
# 注册程序集解析事件,处理System.Buffers版本不匹配问题 $OnAssemblyResolve = [ResolveEventHandler] { param($sender, $e) # 匹配要加载的System.Buffers 4.0.2.0请求 if ($e.Name.StartsWith("System.Buffers, Version=4.0.2.0")) { # 加载你本地的4.5.1版本程序集 return [System.Reflection.Assembly]::LoadFrom("C:\Program Files\PackageManagement\Nuget\Packages\system.buffers\4.5.1\lib\netstandard2.0\System.Buffers.dll") } return $null } [AppDomain]::CurrentDomain.add_AssemblyResolve($OnAssemblyResolve) # 原来的Add-Type代码,可删掉手动加载System.Buffers的行,事件会自动处理 Add-Type -Path "C:\Program Files\PackageManagement\NuGet\Packages\mimekit\2.15.0\lib\netstandard2.0\MimeKit.dll" Add-Type -Path "C:\Program Files\PackageManagement\NuGet\Packages\mailkit\2.15.0\lib\netstandard2.0\MailKit.dll" # 脚本执行完后可选择移除事件,避免影响后续执行 # [AppDomain]::CurrentDomain.remove_AssemblyResolve($OnAssemblyResolve)
方案2:修改PowerShell Desktop全局配置文件(不推荐,影响所有脚本)
找到PowerShell Desktop的配置文件,路径通常为C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe.config,在<configuration> -> <runtime>节点下添加绑定重定向规则:
<dependentAssembly> <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" /> </dependentAssembly>
方案3:切换到PowerShell 7+运行
如果没有必须使用PowerShell Desktop的强制要求,直接用PowerShell 7+运行脚本,不需要任何修改即可正常执行。
内容的提问来源于stack exchange,提问作者jflener
相关产品推荐
相关产品推荐

