PowerShell スクリプト式をC#から実行する
自宅に居さえすれば何していたっていいんだよな。つーことで。
話題にしたWindows PowerShellだが、思惑通りにDIの評価式に使うには、.NETプラットホームの言語中、具体的にはC#等から比較的簡単にスクリプト式を実行することができて、尚且つ結果を取得できなくてはならない訳で、できるかどうか早速試してみた。
- Windows PowerShellのインストール
最新のRC1パッケージをインストールするだけ。(要.NET Framework 2.0)
Download Windows PowerShell Release Candidate
- PowerShellのクラスをC#から使う
インストールしたパッケージのディレクトリには以下の.NETアセンブリが含まれていた。
Microsoft.PowerShell.Security.dll
Microsoft.PowerShell.ConsoleHost.dll
Microsoft.PowerShell.Commands.Utility.dll
Microsoft.PowerShell.Commands.Management.dll
System.Management.Automation.dll
このうち、単純なスクリプトの実行に使用するのはSystem.Management.Automation.dllだけのようだ。早速簡単なアプリケーションを書いてみよう。
using System; using System.Management.Automation; namespace PowerShellInvokeTest { class Program { static void Main(string[] args) { try { RunspaceInvoke invoker = new RunspaceInvoke(); //PowerShellでDateTime.Nowを取得 string script = "[DateTime]::Now"; object result = invoker.Invoke(script)[0].BaseObject; Console.WriteLine(result); //PowerShellでSizeオブジェクトを生成 script = "new-object System.Drawing.Size(100, 100)"; result = invoker.Invoke(script)[0].BaseObject; Console.WriteLine(result); //PowerShellでFormオブジェクトを生成して表示 script = "new-object System.Windows.Forms.Form"; result = invoker.Invoke(script)[0].BaseObject; (result as System.Windows.Forms.Form).Show(); } finally { Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } } } }
スクリプトの実行と結果の取得はRunspaceInvokeクラスのインスタンスのInvokeメソッドにパラメタとしてスクリプト式を渡すだけであり、非常に簡単であることが判る。スクリプトの実行結果はCollection
object result = invoker.Invoke(script)[0].BaseObject;
以下、実行した結果のスクリーンショット。
PowerShellによって生成されたSystem.Windows.Forms.Formクラスのインスタンスに対して実行したShowメソッドも成功しているのが判る。
PowerShell自体が.NETで作られていることからして、.NET Frameworkへのアクセスには制限は無い訳で、式評価エンジンとして使うには、かなりいいかもしれない。