我正在构建一个利用MailKit和MimeKit使用PowerShell发送电子邮件的脚本。我在我的开发机器上构建了这个脚本的可运行版本,现在我正试图让它在服务器上运行。我遇到的第一个问题是,我不能像在我的开发机器上那样使用Add。当在我希望部署脚本的服务器上使用Add时,我会得到以下错误

(这可能是我问题的根源)。作为一种解决办法,我所做的是使用[System.Reflection.Assembly]::LoadFrom($PathToDLL),它的工作方式与预期的一样。为了验证它是否有效,我使用上面的命令加载了MailKit程序集,并且能够通过执行$SMTP = New-Object MailKit.Net.Smtp.SmtpClient来实例化SMTPClient对象,但是如果我使用[System.Reflection.Assembly]::LoadFrom加载MimeKit的DLL,然后尝试通过运行New-Object MimeKit.MimeMessage来实例化对象,则会得到一个错误Exception calling ".ctor" with "0" arguments": could not load file or assembly 'System.Memory'...。
接下来的步骤是尝试使用System.Memory安装NuGet,然后使用LoadFrom将程序集导入到当前会话中。导入System.Memory后,我再次尝试实例化Mimekit.MimeMessage并接收相同的错误,但它不能加载System.Memory,而是无法加载System.Buffers。我遵循相同的过程从Nuget下载System.Buffers并成功地用[System.Reflection.Assembly]::LoadFrom($PathToSystemBuffersDLL)导入它,但是我仍然收到Exception calling ".ctor" with "0" arguments": could not load file or assembly 'System.Buffers version=4.0.2.0., Culture=nuetral etc. The system could not find the file specified.
我尝试用NuGet重新安装软件包,尝试导入其他版本,包括net462、net461和任何其他版本,但都没有效果。我做了相当广泛的研究,但对于下一步该做什么,我有点拘束。我认为一些与我所经历的非常相关的事情在这里的答案中被描述了,Cannot Load Assemblies For .Net Standard library (System.Text.Json)。我使用Install-Package -source 'nuget' $PackageName安装我的软件包。值得注意的是,要安装这些软件包,我必须使用NuGet的API版本2。(https://www.nuget.org/api/v2)
在Windows 2016上生成错误的代码,而不是在Windows 10 Pro上生成错误的代码。使用PowerShell 5和.NET Framework4.8(服务器上4.8.03761,Windows10上4.8.04084 )
#Add-Type -Path "C:\Program Files\PackageManagement\NuGet\Packages\MailKit.3.4.1\lib\netstandard2.0\MailKit.dll" #Gives error
#Add-Type -Path "C:\Program Files\PackageManagement\NuGet\Packages\MimeKit.3.4.1\lib\netstandard2.0\MimeKit.dll" #gives error
[System.Reflection.Assembly]::LoadFrom("C:\Program Files\PackageManagement\NuGet\Packages\MailKit.3.4.1\lib\netstandard2.0\MailKit.dll") #success
[System.Reflection.Assembly]::LoadFrom("C:\Program Files\PackageManagement\NuGet\Packages\MimeKit.3.4.1\lib\netstandard2.0\MimeKit.dll") #success
$SMTP = New-Object MailKit.Net.Smtp.SmtpClient #works after loading mailkit assembly
$Message = New-Object MimeKit.MimeMessage #complains about System.Memory, if I run LoadFrom and add the System.Memory.dll package, will complain about System.Buffers.dll发布于 2022-10-19 20:08:38
其他可能会遇到这个问题的人。我已经通过切换到PowerShell 7来解决这个问题。我可以用Add Type -Path $DLLPath成功地加载DLL。
https://stackoverflow.com/questions/74049052
复制相似问题