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 で指定できます。どんなオプションがあるかはコマンドライン コンパイラで確認してください。