PowerShell から .NET のコード片を実行する
特定の .NET の型のメソッドの挙動を、ちらっと確認したい…そんな時にも PowerShell は便利です。
PowerShell がない頃はコマンドラインからメソッドの中身だけを書いてCodeDomCompilerを呼び出すようなコマンドライン アプリケーションを作っていましたが、PowerShell のおかげで楽ができるようになりました。前回の Add-Type コマンドは、アセンブリを読み込むだけではなくソースコードを指定して型(とメソッド)を追加することができます。
慣れてくれば、PowerShell 上からメソッドを呼び出して確認できるのですが、エスケープ表記の違いや変数の中身が .NET にわたるときの変換処理など、PowerShell になれないうちは全部を C# や VB で書けるほうが便利ですよね。
PS > Add-Type @" public class MyTest1 { public static object test1() { return 1; } } "@ PS > [MyTest1]::test1() 1
こんなかんじで、ささっと書いたソースを実行させてみることができます。ソースコードは文字列ではなくファイル名で与えることもできます。メソッドだけを定義する場合には型の名前を指定して
PS > Add-Type MyTest2 @" public static object test2() { return 1; } "@
といったかんじでメソッドの実装を与えます。ただし、-Namespace を使ってネームスペースを指定しないと、MyTest2 クラスのネームスペースが Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes という長ったらしいものになってしまうので、-Namespace は忘れないようにしましょう。
var 等のC# 3.0 の機能を有効にするためには -Language CSharpVersion3 を指定し、VB のソースを指定する場合には、-Language VisualBasic を指定します。F# は -Language オプションで指定できないため CodeDomProvider の作成が必要になります。
# まず、CodeDomProvider を読み込む PS > Add-Type -Path FSharp.Compiler.CodeDom.dll # CodeDomProvider をインスタンス化する PS > $fp = New-Object Microsoft.FSharp.Compiler.CodeDom.FSharpCodeProvider # F# コードをコンパイルする PS > Add-Type "let ..." -CodeDomProvider $fp
コンパイルオプションは -CompilerParameters で指定できます。どんなオプションがあるかはコマンドライン コンパイラで確認してください。