SmtpClient編 に続きMailKit編です。
パッケージの確認
https://www.nuget.org/ にアクセスしてMailKitを検索します。
名前・バージョン・Dependenciesを確認して、依存パッケージを辿ります。
MailKit -> MimeKit -> Portable.BouncyCastleの順で依存関係があることが分かります。
MailKit のインストール
PowerShellを管理者モードで起動し、各パッケージをインストールします。
PS > Install-Package -Name Portable.BouncyCastle -Source https://www.nuget.org/api/v2
The package(s) come(s) from a package source that is not marked as trusted.
Are you sure you want to install software from 'https://www.nuget.org/api/v2'?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): Y
Name Version Source Summary
---- ------- ------ -------
Portable.BouncyCastle 1.8.10 https://www.nuget.org/api/v2 BouncyCastle portable version with ...
PS > Install-Package -Name MimeKit -Source https://www.nuget.org/api/v2
The package(s) come(s) from a package source that is not marked as trusted.
Are you sure you want to install software from 'https://www.nuget.org/api/v2'?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): Y
Install-Package : Dependency loop detected for package 'MimeKit'.
発生場所 行:1 文字: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 > Install-Package -Name MimeKit -Source https://www.nuget.org/api/v2 -SkipDependencies
The package(s) come(s) from a package source that is not marked as trusted.
Are you sure you want to install software from 'https://www.nuget.org/api/v2'?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): Y
Name Version Source Summary
---- ------- ------ -------
MimeKit 2.15.1 https://www.nuget.org/api/v2 An Open Source library for creating...
PS > Install-Package -Name MailKit -Source https://www.nuget.org/api/v2
The package(s) come(s) from a package source that is not marked as trusted.
Are you sure you want to install software from 'https://www.nuget.org/api/v2'?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): Y
Name Version Source Summary
---- ------- ------ -------
MailKit 2.15.0 https://www.nuget.org/api/v2 An Open Source .NET mail-client lib
...
Dependency loop detected
について
Dependency loop detected
というエラーが出たら、-SkipDependencies
オプションを付けて実行します。
https://github.com/OneGet/oneget/issues/475 にあるとおり、現行の OneGet のInstall-Package
は単純な依存関係でないとエラーが出るようです。PackageManagementがOneGetではなくなるPowerShellGet v3で解消するようですが、現在はベータ版ということもあり確認しておりません。
なお、現在の私のInstall-Package
コマンドレットのモジュールとバージョンは以下のとおりです。
PS > Get-Command -Name Install-Package | Select-Object -Property ModuleName
ModuleName
----------
PackageManagement
PS > Get-InstalledModule PackageManagement
Version Name Repository Description
------- ---- ---------- -----------
1.4.7 PackageManagement PSGallery PackageManagement (a.k.a. OneGet) is a new way t...
アセンブリの読み込み
ダウンロードしてアセンブリを読み込んでみます。ダウンロードしたパッケージは -Destination
を指定していなければ "C:\Program Files\PackageManagement\NuGet\Packages\” にあります。
Add-Type
コマンドレットでMailKit.dllを読み込んでみます。
PS > Add-Type -Path "C:\Program Files\PackageManagement\NuGet\Packages\MailKit.2.15.0\lib\net45\MailKit.dll"
Add-Type : 要求された型のうち 1 つまたは複数を読み込めませんでした。詳細については、LoaderExceptions プロパティを取得してください。
発生場所 行:1 文字:1
+ Add-Type -Path "C:\Program Files\PackageManagement\NuGet\Packages\Mai ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Add-Type], ReflectionTypeLoadException
+ FullyQualifiedErrorId : System.Reflection.ReflectionTypeLoadException,Microsoft.PowerShell.Commands.AddTypeCommand
エラーが発生しました。
LoaderExceptions プロパティを取得してください。
とのことですので、try-catch
ブロックで囲んで実行します。
try
{
Add-Type -Path "C:\Program Files\PackageManagement\NuGet\Packages\MailKit.2.15.0\lib\net45\MailKit.dll"
}
catch [System.Reflection.ReflectionTypeLoadException]
{
Write-Host "Message: $($_.Exception.Message)"
Write-Host "StackTrace: $($_.Exception.StackTrace)"
Write-Host "LoaderExceptions: $($_.Exception.LoaderExceptions)"
}
Message: 要求された型のうち 1 つまたは複数を読み込めませんでした。詳細については、LoaderExceptions プロパティを取得してください。
StackTrace: 場所 System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
場所 System.Reflection.Assembly.GetTypes()
場所 Microsoft.PowerShell.Commands.AddTypeCommand.LoadAssemblyFromPathOrName(List`1 generatedTypes)
場所 Microsoft.PowerShell.Commands.AddTypeCommand.EndProcessing()
場所 System.Management.Automation.CommandProcessorBase.Complete()
LoaderExceptions: System.IO.FileNotFoundException: ファイルまたはアセンブリ 'MimeKit, Version=2.15.0.0, Culture=neutral, PublicKeyToken=bede1c8a46c66814'、またはその
依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。
ファイル名 'MimeKit, Version=2.15.0.0, Culture=neutral, PublicKeyToken=bede1c8a46c66814' です。'MimeKit, Version=2.15.0.0, Culture=neutral, PublicKeyToken=bede1c8a46c66814'
依存関係にあるMimeKitを先に読み込む必要があることが分かります。
したがって、
Add-Type -Path "C:\Program Files\PackageManagement\NuGet\Packages\Portable.BouncyCastle.1.8.10\lib\net40\BouncyCastle.Crypto.dll"
Add-Type -Path "C:\Program Files\PackageManagement\NuGet\Packages\MimeKit.2.15.1\lib\net45\MimeKit.dll"
Add-Type -Path "C:\Program Files\PackageManagement\NuGet\Packages\MailKit.2.15.0\lib\net45\MailKit.dll"
の順にするとエラーなく各アセンブリを読み込むことができます。
なお、以下のようにAdd-Type
の代わりに .NET Framework のLoadFile
メソッドを使うこともできます。その場合は依存関係によるエラーは出ません。
[System.Reflection.Assembly]::LoadFile("C:\Program Files\PackageManagement\NuGet\Packages\MailKit.2.15.0\lib\net45\MailKit.dll")
次回実装編に続く。