2011/04/26
PowerShellでJScript.NETのコードを実行する
PowerShell 2.0ではAdd-Typeコマンドレットを用いてC#など他言語のコードをコンパイルし実行することが可能です。(P/Invokeも可能です)
ほとんど使っている方はいないと思われますが、JScript.NETのコードもコンパイルして実行できます。以下、コード例です。
$code=@" static function writeHello() { System.Console.WriteLine("Hello JScript.NET World!"); } "@ $c = Add-Type -Language JScript -MemberDefinition $code -Name "JSTest" -PassThru $c[1]::writeHello()
JScript.NETのスタティックメソッドを用意してやると、Add-Typeコマンドレットによりそのメソッドを持ったクラス(ここではMicrosoft.PowerShell.Commands.AddType.AutoGeneratedTypes.JSTest)が生成されます。-passThruパラメータを指定することでその型情報が変数に代入できます。あとはJSTestクラスのスタティックメソッドを::演算子で呼び出すのですが、なぜかAdd-Typeが目的のクラスの型以外にJScript.NETのグローバルクラス?の型情報も一緒に出力するので、型情報が配列になっています。よってインデックスを指定してからスタティックメソッドを呼ぶようにします。
ここではスタティックメソッドを実行する例を挙げましたが、インスタンスメソッドも実行できるか試してみました。
$code=@" import System; public class JSTest { public function writeHello() { Console.WriteLine("Hello JScript.NET World!"); } } "@ Add-Type -Language JScript -TypeDefinition $code $o = new-object JSTest $o.writeHello()
ところがこれはNew-Objectのところで「New-Object : "0" 個の引数を指定して ".ctor" を呼び出し中に例外が発生しました: "アプリケーションでエラーが発生しました。"」というエラーになってしまいます。コンストラクタの実行でしくっているようですが…。ちなみに明示的にfunction JSTest()というコンストラクタを定義してやってもだめでした。なんででしょうね?
元記事:http://blogs.wankuma.com/mutaguchi/archive/2011/04/26/198645.aspxCopyright © 2005-2018 Daisuke Mutaguchi All rights reserved
mailto: mutaguchi at roy.hi-ho.ne.jp
プライバシーポリシー