読者です 読者をやめる 読者になる 読者になる

PowerShellでVisualBasicを利用する

こちらのページを見て、ひょっとしたらPowerShellからVisualBasicのコードをそのまま利用できるのでは、と思いついたのでメモ。
VBCodeProvider クラス (Microsoft.VisualBasic)


簡単なクラスのコード。

Public Class SampleClass
   Private name as String
   Public id

   Function SayHello
     SayHello = "Hello"
   End Function
 End Class

上記をPowerShellで使用するコード。

$provider = New-Object "Microsoft.VisualBasic.VBCodeProvider";

$compilerParameters = New-Object "System.CodeDom.Compiler.CompilerParameters";
$compilerParameters.GenerateInMemory = $true;

# VBのコード
$sourceCode = @"
Public Class SampleClass
  Private name as String
  Public id

  Function SayHello
    SayHello = "Hello"
  End Function
End Class
"@;

# コンパイル
$result = $provider.CompileAssemblyFromSource($compilerParameters, $sourceCode);

# メモリ上にアセンブリを展開したので、おそらくすでにロード済み
# そのためすぐ使える
$assembly = $result."CompiledAssembly";

# VBのクラスのインスタンスを作成する
$obj = New-Object "SampleClass";
$obj.SayHello(); # "Hello"が得られる
$obj.id = 100;   # メンバ変数にもアクセス可能

Get-Memberの結果はこちら。

PS C:\Users\Someone> $obj | Get-Member


   TypeName: SampleClass

Name        MemberType Definition
----        ---------- ----------
Equals      Method     bool Equals(System.Object obj)
GetHashCode Method     int GetHashCode()
GetType     Method     type GetType()
SayHello    Method     System.Object SayHello()
ToString    Method     string ToString()
id          Property   System.Object id {get;set;}

メンバ変数はプロパティ扱いになっている様子。

とりあえず使えるっぽいが、

  • VBの使える予約語・使えない予約語はないのか
  • アセンブリをロードしない方法・アンロードする方法はあるか
  • パフォーマンス、リソース使用状況

は確認しておく必要がありそう。

仕様を理解し、使うことに問題がないと判断できれば

などが考えられそうだ。