10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-08-06

最近の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使うべきなのかもしれません。


10
7
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?