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

PowerShellスクリプト内でC#コードを書いて使う

今回はPowerShell内でC#コードでクラスを書いて、そのC#クラスをPowerShellからそのまま使うというTipsです。Add-Typeというコマンドレットを使います。C#からPowerShell呼び出しというのはよくありますがその逆です。


元になるC#コード

まずは簡単なC#のコード書いてみます。
SpeakerクラスのSaySomething3Timesというメソッドを使って、
引数の文字列を3回書きだす単純なプログラムです。

using System;

namespace Speaker
{
    class Program
    {
        static void Main(string[] args)
        {
            Speaker.SaySomething3Times(args[0]);
        }
    }
    public static class Speaker
    {
        public static void SaySomething3Times(string word)
        {
            Console.WriteLine(word + "!" + word + "!" + word + "!");
        }
    }
}

実行するとこんな感じです。

>Speaker.exe HELLO
HELLO!HELLO!HELLO!

Powershellから呼び出し

先ほどのC#コードをPowerShellに組み込んでみます。
$sourceという変数にC#ソースコードを文字列として格納して、$assembliesで定義された"System"への参照を定義しながら、Add-Typeコマンドレットで組み込んでます。

param($word)

$assemblies = (
 "System"
)

$source = @"
using System;
public static class Speaker
    {
        public static void SaySomething3Times(string word)
        {
            Console.WriteLine(word + "!" + word + "!" + word + "!");
        }
    }
"@

Add-Type -ReferencedAssemblies $assemblies -TypeDefinition $source -Language CSharp
[Speaker]::SaySomething3Times($word)


実行するとこんな感じです。

PS M:\TEMP> .\Speaker.ps1 HELLO
HELLO!HELLO!HELLO!

あまり使う場面無いかもしれないですが、ちょっと面白いです。
Powershell内でのC#クラスのもう少し詳しい使い方はこちらに。
Powershell内で書いたC#で書いたクラスを使う(コンストラクターやプロパティの利用) - YOMON8.NET