最近のWindows(Vista以降?)だと普通はPowerShellが入っています。
PowerShellは従来のバッチファイルに比べると使いやすいです。
ただし、文法に罠が多く、大概遅くなりもにょります(経験上)。
C#と併用するのが一番ベストだと思うので、備忘録的にまとめます。
開発環境
- Windows 10 (1803)
- $PSVersionTable.PSVersion は5 1 17134 165
ヒアストリングを使う方法
よく見かける方法は以下のようにヒアストリングで書く方法です。
$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で読み込む
ファイルをそのまま文字列化してやれば良いだろうという発想で。
using System;
public static class Hello
{
public static void Main()
{
Console.WriteLine( "Hello" );
}
}
$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使うべきなのかもしれません。