背景:
尝试在Win10上使用Powershell发送电子邮件,并希望使用端口587和TLS 1.2与SMTP服务器通信。
尝试使用Nuget图库包:MailKit及其依赖项MimeKit,因为考虑到安全性问题,微软不推荐System.Net.Mail.SmtpClient。
使用Powershell安装MailKit (这似乎有效),然后对MimeKit也一样,但是MimeKit包安装失败(正如您可以看到的那样,异常字符串对于依赖项循环的确切性质没有特别的帮助):
PS C:\bin\ps1\renew_certs> Install-Package -Name 'MimeKit' -Source "https://www.nuget.org/api/v2" -Force
Install-Package : Dependency loop detected for package 'MimeKit'.
At line:1 char:1
+ Install-Package -Name 'MimeKit' -Source "https://www.nuget.org/api/v2 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : Deadlock detected: (MimeKit:String) [Install-Package], Exception
+ FullyQualifiedErrorId :
DependencyLoopDetected,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage
PS C:\bin\ps1\renew_certs> ($error[0].Exception.GetBaseException())
Dependency loop detected for package 'MimeKit'.这里关于依赖循环异常的另一个答案是建议在installation上使用-SkipDependency参数,这避免了安装异常。
我继续尝试运行我的代码,但是这导致了一个异常(非常类似于这个问题所涉及的异常),在这种情况下
PS C:\bin\ps1\renew_certs> ($error[0].Exception.GetBaseException())结果字符串指示无法加载的文件或程序集是包Portable.BouncyCastle,它被标识为MimeKit的依赖项。
因此,我为Portable.BouncyCastle使用了Install(我没有使用-SkipDependencies,所以我假设它们已经安装了),然后在代码中也使用了Add来加载DLL。
这似乎可以防止与BouncyCastle相关的异常;但是,现在运行代码会产生异常,这是我问题的主题:
代码:
Add-Type -Path "C:\Program Files\PackageManagement\NuGet\Packages\System.Text.Encoding.CodePages.6.0.0\lib\netstandard2.0\System.Text.Encoding.CodePages.dll"
Add-Type -Path "C:\Program Files\PackageManagement\NuGet\Packages\Portable.BouncyCastle.1.9.0\lib\netstandard2.0\BouncyCastle.Crypto.dll"
Add-Type -Path "C:\Program Files\PackageManagement\NuGet\Packages\MimeKit.3.3.0\lib\netstandard2.0\MimeKit.dll"
Add-Type -Path "C:\Program Files\PackageManagement\NuGet\Packages\MailKit.3.3.0\lib\netstandard2.0\MailKit.dll"
$SMTP = New-Object MailKit.Net.Smtp.SmtpClient
$Message = New-Object MimeKit.MimeMessage
<#
$TextPart = [MimeKit.TextPart]::new("plain")
$TextPart.Text = "There was a deployment"
<#例外:
PS C:\bin\ps1\renew_certs> . "c:\bin\ps1\renew_certs\send_email.ps1"
New-Object : Exception calling ".ctor" with "0" argument(s): "The type initializer for 'MimeKit.ParserOptions' threw an exception."
At C:\bin\ps1\renew_certs\send_email.ps1:9 char:13
+ $Message = New-Object MimeKit.MimeMessage
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [New-Object], MethodInvocationException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
PS C:\bin\ps1\renew_certs> ($error[0].Exception.GetBaseException())
Could not load file or assembly 'System.Text.Encoding.CodePages, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its
dependencies. The system cannot find the file specified.
PS C:\bin\ps1\renew_certs>System.Text.Encoding.CodePages被列为MimeKit的依赖项,因此我试图解决类似于BouncyCastle的情况,但是System.Text.Encoding.CodePages安装也会失败。因此,我确实安装了-SkipDependencies标志,并在代码中显式地添加了add;但是,仍然是相同的例外。
在MimeKit中,System.Text.Encoding.CodePages的依赖项表示(>= 4.5.1),安装的依赖项是SystemT.ext.Encoding.CodePages.6.0.0目录。异常错误字符串表示无法加载的文件或程序集是Version=4.1.1.0,但在库中没有看到任何4.1.*版本。
想知道这是否是System.Text.Encoding.CodePages的依赖,然后我试着安装System.Memory包,但它也失败了依赖循环错误,看看它的依赖项,我不知所措。
是否有任何方法可以确切地了解依赖循环错误发生的原因,或者哪些文件实际上丢失了?
这个问题可能完全是别的问题吗?
异常字符串表示“系统找不到指定的文件”。到底有没有看到没有找到的文件呢?
当我在VS代码中运行Powershell调试器时,会抛出异常,进入MimeKit.TextPart::new(“平原”)。要调试到DLL中吗?
发布于 2022-09-04 01:58:15
您需要精确的System.Text.Encoding.CodePages v4.5.1 (6.0.0坏兼容性)。
您可能仍然有错误,因为您使用了-SkipDependencies,因此谁知道您仍然缺少什么。
https://stackoverflow.com/questions/72623209
复制相似问题