PowerShell实例化MimeKit.MimeMessage遇System.Buffers/Memory加载失败求助
问题解决:Windows Server 2016上PowerShell加载MailKit/MimeKit的依赖问题
问题现象
脚本在Windows 10 Pro上正常运行,部署到Windows Server 2016时出现以下异常:
- 使用
Add-Type加载MailKit、MimeKit的DLL报错,改用[System.Reflection.Assembly]::LoadFrom加载MailKit成功,可正常实例化SmtpClient; - 加载MimeKit后实例化
MimeMessage时,提示无法加载System.Memory程序集;安装并加载System.Memory后,又提示无法加载System.Buffers;加载System.Buffers后仍提示找不到指定版本的System.Buffers; - 已尝试重装NuGet包、导入net462等不同版本的程序集,均无效,使用NuGet API v2安装包。
两台机器均使用PowerShell 5和.NET Framework 4.8,但版本细节存在差异。
报错代码示例:
#Add-Type -Path "C:\Program Files\PackageManagement\NuGet\Packages\MailKit.3.4.1\lib\netstandard2.0\MailKit.dll" #报错 #Add-Type -Path "C:\Program Files\PackageManagement\NuGet\Packages\MimeKit.3.4.1\lib\netstandard2.0\MimeKit.dll" #报错 [System.Reflection.Assembly]::LoadFrom("C:\Program Files\PackageManagement\NuGet\Packages\MailKit.3.4.1\lib\netstandard2.0\MailKit.dll") #成功 [System.Reflection.Assembly]::LoadFrom("C:\Program Files\PackageManagement\NuGet\Packages\MimeKit.3.4.1\lib\netstandard2.0\MimeKit.dll") #成功 $SMTP = New-Object MailKit.Net.Smtp.SmtpClient #加载MailKit后可正常运行 $Message = New-Object MimeKit.MimeMessage #提示缺少System.Memory,加载后又提示缺少System.Buffers,加载后仍版本不匹配
解决方案
1. 切换到.NET Framework兼容的包版本
netstandard2.0版本的包在.NET Framework 4.8环境下易出现依赖解析问题,建议下载net462或更高.NET Framework目标版本的MailKit和MimeKit包:
- 从NuGet获取对应版本的包(如MailKit.3.4.1的net462版本),解压后找到
lib\net462目录下的DLL文件; - 使用
Add-Type或[System.Reflection.Assembly]::LoadFrom加载该版本DLL,规避netstandard带来的兼容问题。
2. 添加程序集版本绑定配置
若必须使用netstandard版本,可通过配置文件强制版本绑定,解决System.Memory、System.Buffers的版本不匹配问题:
- 在脚本目录下创建
powershell.exe.config文件,内容如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" /> </dependentAssembly> <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> </assemblyBinding> </runtime> </configuration>
- 重启PowerShell会话使配置生效,再尝试加载并实例化相关类。
3. 用NuGet自动处理依赖
避免手动单独安装依赖包,使用Install-Package命令一次性安装MailKit(自动拉取所有兼容依赖):
Install-Package MailKit -Version 3.4.1 -Source https://api.nuget.org/v3/index.json
- 安装完成后,按顺序加载依赖及目标DLL:
# 先加载依赖项 [System.Reflection.Assembly]::LoadFrom("C:\Program Files\PackageManagement\NuGet\Packages\System.Memory.4.5.5\lib\net461\System.Memory.dll") [System.Reflection.Assembly]::LoadFrom("C:\Program Files\PackageManagement\NuGet\Packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll") # 再加载MailKit和MimeKit [System.Reflection.Assembly]::LoadFrom("C:\Program Files\PackageManagement\NuGet\Packages\MailKit.3.4.1\lib\net462\MailKit.dll") [System.Reflection.Assembly]::LoadFrom("C:\Program Files\PackageManagement\NuGet\Packages\MimeKit.3.4.1\lib\net462\MimeKit.dll")
4. 补全Windows Server 2016的.NET Framework补丁
尽管已安装.NET Framework 4.8,Windows Server 2016可能缺少必要的更新补丁,导致.NET Standard兼容组件无法正常工作。安装最新的Windows更新,确保.NET Framework 4.8的所有补丁都已部署。
内容的提问来源于stack exchange,提问作者Davis
相关产品推荐
相关产品推荐

