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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:25:15