kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

LoadWithPartialNameをやめてAdd-Typeコマンドレットへ

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はこれだけではなくて、動的にVBC#ソースを動的に取り込んだり、なんと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");

簡単ですね!