Edited at

PowerShellでC#をファイルからコンパイル

More than 1 year has passed since last update.

最近のWindows(Vista以降?)だと普通はPowerShellが入っています。

PowerShellは従来のバッチファイルに比べると使いやすいです。

ただし、文法に罠が多く、大概遅くなりもにょります(経験上)。

C#と併用するのが一番ベストだと思うので、備忘録的にまとめます。


開発環境


  • Windows 10 (1803)

  • $PSVersionTable.PSVersion は5 1 17134 165


ヒアストリングを使う方法

よく見かける方法は以下のようにヒアストリングで書く方法です。


run.ps1

    $src = @'

using System;

public static class Hello
{
public static void Main()
{
Console.WriteLine( "Hello" );
}
}
'@
Add-Type -TypeDefinition $src -Language CSharp
[Hello]::Main()


C#のクラスをメモリ上に読み込むので、PowerShellから実行して好き勝手使うことができます。デバッグもしやすいです。

ただし、一度コンパイルするとメモリ上にクラスが残り続けるので、再コンパイルする時にはPowerShellを立ち上げ直す必要があります。

この方法はPowerShellで直に実行するには便利ですが、

エディタによるが大概C#の部分がシンタックスハイライトされないし、少し大きめのコードを書きたい時に気になります。

(あまりにも大きいコード書くぐらいならVisualStudio使えってなりそうだけど)


Out-Stringで読み込む

ファイルをそのまま文字列化してやれば良いだろうという発想で。


hoge.cs


using System;

public static class Hello
{
public static void Main()
{
Console.WriteLine( "Hello" );
}
}



run.ps1

    $src = cat hoge.cs | Out-String

Add-Type -TypeDefinition $src -Language CSharp
[Hello]::Main()


ファイルが複数の場合

※コメント頂いた内容を元に修正しました。

上記の開発環境の場合は

Add-Type .\a.cs, .\b.cs

だけでいけます。


※古い環境(Win7 PowerShell2.0以前?)で新しめのC#使いたい場合

追記:

複数ソースコードがある場合は使えなさそうです。

ここ以下のコメントを参照ください。

原因:


Add-Typeの`-Language`と`-Path`は同時使用できない。

C#3.0以降の構文を使用している場合、拡張子から判定で古いC#としてコンパイルしようとします。C#3.0として認識させたくても上記の制約で-Languageを指定できず詰みます。

Add-Typeでやる場合片方のコードをDLLに吐いてから

-ReferencedAssembliesでDLLを参照してexeを作ることで一応動きました。

ただ、exeにしてしまうとPowerShellからクラスが呼べるという利点がなくなってしまいます。

もうこうなるとcscを使うか、結局素直にVisualStudio使うべきなのかもしれません。