2014年7月15日火曜日

PowerShell で .NET の「型が見つかりません」エラー

Windows PowerShell で .NET Framework のクラスを使うと「型が見つかりません。この型を含むアセンブリが読み込まれていることを確認してください。」というエラーが発生した。これは .NET Framework のアセンブリはデフォルトでは全てロードされていないために発生しています。追加で必要なアセンブリを読み込む必要があります。

「型が見つかりません」エラーの例

PS> $mail = New-Object System.Web.Mail.MailMessage
New-Object : 型 [System.Web.Mail.MailMessage] が見つかりません。この型を含むアセンブリが読み込まれていることを確認してください。
発生場所 行:1 文字:19
+ $mail = New-Object <<<<  System.Web.Mail.MailMessage
    + CategoryInfo          : InvalidType: (:) [New-Object]、PSArgumentException
    + FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand

手順1: まず MSDN でこのクラスのアセンブリを確認する

(例)MailMessage クラス
http://msdn.microsoft.com/ja-jp/library/system.web.mail.mailmessage.aspx
アセンブリ: System.Web (System.Web.dll 内)

手順2: アセンブリ名を確認したら、そのアセンブリを読み込む

LoadWithPartialName メソッドを使う場合
PS> [System.Reflection.Assembly]::LoadWithPartialName("System.Web")
GAC    Version        Location
---    -------        --------
True   v2.0.50727     C:\windows\assembly\GAC_32\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll
ただし、LoadWithPartialName メソッドは便利だけど非推奨になっているので、正式にやるならば、次の Load メソッドを使います。Load メソッドはアセンブリの完全な表示名を要求されます。表示名に使う PublicKeyToken など各項目は、目的の dll ファイルを右クリックして「プロパティ」を参照すれば分かります。

Load メソッドを使う場合
PS> [System.Reflection.Assembly]::Load("System.Web, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a")

正しく読み込まれたことを確認できます
PS> [AppDomain]::CurrentDomain.GetAssemblies() | FINDSTR System.Web


■ 関連する資料のリンク

.NET Framework 2.0 で廃止予定の型とメンバの一覧 (アセンブリ単位)
http://msdn.microsoft.com/ja-jp/library/cc825681.aspx
LoadWithPartialName(String partialName)
このメソッドは非推奨になりました。代わりに、Assembly.Load() を使用してください。

アセンブリの読み込みのベスト プラクティス
http://msdn.microsoft.com/ja-jp/library/dd153782.aspx
LoadWithPartialName メソッドは、現在は使用されない形式として設定されています。 代わりに Assembly.Load メソッドを使用して、アセンブリの完全な表示名を指定することをお勧めします。

Assembly.LoadWithPartialName メソッド
http://msdn.microsoft.com/ja-jp/library/system.reflection.assembly.loadwithpartialname.aspx

Assembly.Load メソッド
http://msdn.microsoft.com/ja-jp/library/system.reflection.assembly.load.aspx