PowerShellで動的にアセンブリを読み込ませる場合、LoadWithPartialNameをを使う例がごまんと出てきますが、.NET 2.0以降、互換性のために残されているというマークがついています。でも4.0でも生き残りました。Scripting Guy!でも「ほかの方法は性能が低いので説明しないよ」なんて書かれています。
Windows PowerShell を使用して [ファイルを開く] ダイアログ ボックスを開く方法はありますか
どうしようかなぁと思っていたら、2.0からはAdd-Typeコマンドレットが追加されているという話を教えてもらいました。試してみるとこれは便利。こんな風に使います。
Add-Type
PS>Add-type -AssemblyName System.Windows.Forms
これで読み込まれます。Add-typeはこれだけではなくて、動的にVBやC#ソースを動的に取り込んだり、なんとP/Invokeをしかけることまでできてしまいます。今までMessageBoxを表示させたくてSystem.Windows.Formsを呼び出していたかもしれないですが、(値調べるめんどくささを除けば)いけてしまいます。個人的にうれしいのはiniファイルの読み書きがPowerShellでできるようになることかな。こんな感じ。
$Signature =@"
[DllImport("KERNEL32.DLL")]
public static extern uint
GetPrivateProfileInt( string lpAppName,
string lpKeyName, int nDefault, string lpFileName );
"@
$Getprivate = add-type -memberDefinition $Signature -name "Win32GetPrivateProfileInt" -namespace Win32Functions -passthru
これでPowerShellからこうすればiniファイルが読み込めます。
$Getprivate::GetPrivateProfileInt("Test", "Test2", 0, "c:\temp\hoge.ini");
簡単ですね!