Visual Studio なしで C# のプログラムをコンパイルする

ちょっとだけ C# を使いたくて。 そのために Visual Studio をインストールするのは時間もかかるし容量も必要になるので。 調べました。

環境

  • Windows 10 Pro 1809
  • .NET Framework 4.7.2

Windows の .NET Framework の C# のコンパイラ

Windows 10 には標準で .NET Framework があって、そこに C# のコンパイラもあるみたいです。

通常、実行可能ファイル csc.exe は、Windows ディレクトリの Microsoft.NET\Framework<バージョン> フォルダーに格納されています。

csc.exe を使用したコマンド ラインからのビルド | Microsoft Docs

次の場所に C# のコンパイラがありました。

  • 32bit: C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe
  • 64bit: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe

VB.NET のコンパイラと思われる「vbc.exe」も同じフォルダーにありました。 参考までに。

次のリンクに csc.exe の使い方のサンプルが記載されていました。

C# コンパイラのコマンド ラインのサンプル

サンプル1

次のプログラム(Program.cs)を作りました。

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");
    }
}

これをコンパイルします。 PowerShell から次のコマンドを入力しました。

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe Program.cs

Program.exe が作られました。

PowerShell から Program.exe を実行しました。

> Program.exe
Hello World!

Visual Studio を使っていた時はあまり意識していなかったので引用しておきます。

-target:exe オプションは既定で有効になっています。 実行可能ファイルは、.exe という拡張子で作成されます。

…略…

-out オプションで指定しない限り、出力ファイル名は Main メソッドを含む入力ファイルと同じになります。

…略…

Main メソッドは、.exe ファイルにコンパイルされるソース コード ファイル内に 1 つだけ必要です。 コードに Main メソッドを含むクラスが複数ある場合は、-main コンパイラ オプションを使用して、Main メソッドを含めるクラスを指定できます。

-target:exe (C# コンパイラ オプション) | Microsoft Docs

Main メソッドは基本的に1つだけ必要だそうです。

サンプル2

dll を作って、それを参照して exe を作ります。

dll の作成

1つ目のプログラム(LibraryClass1.cs)です。

public class LibraryClass1
{
    public string Hello()
    {
        return string.Format("Hello World! {0}", this.GetType().Name);
    }
}

2つ目のプログラム(LibraryClass2.cs)です。

public class LibraryClass2
{
    public string Hello()
    {
        return string.Format("Hello World! {0}", this.GetType().Name);
    }
}

これらをコンパイルします。 PowerShell から次のコマンドを入力しました。

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe -target:library LibraryClass1.cs LibraryClass2.cs

LibraryClass1.dll が作られました。

複数のファイルをコンパイルする場合は引数に続けて指定してあげればいいみたいでした。

-target:library オプションを指定した場合、コンパイラは実行可能ファイル (EXE) ではなく、ダイナミック リンク ライブラリ (DLL) を作成します。

…略…

-out オプションを特に指定しない限り、出力ファイル名は最初の入力ファイルと同じになります。

…略…

.dll ファイルを作成する際に、Mainメソッドは必要ありません。

-target:library (C# コンパイラ オプション) | Microsoft Docs

.dll ファイルを作成する場合は Main メソッドは必要ないそうです。

exe の作成

次のプログラム(Class1.cs)を作りました。

using System;

class Class1
{
    static void Main(string[] args)
    {
        Console.WriteLine(new LibraryClass1().Hello());
        Console.WriteLine(new LibraryClass2().Hello());
    }
}

これをコンパイルします。 PowerShell から次のコマンドを入力しました。

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe -reference:LibraryClass1.dll Class1.cs

Class1.exe が作られました。

-reference オプションを指定すると、コンパイラは指定されたファイルの public 型の情報を現在のプロジェクトにインポートし、指定されたアセンブリ ファイルからメタデータを参照できるようにします。

…略…

アセンブリ マニフェストを含むファイルの名前。 複数のファイルをインポートするには、ファイルごとに個別に -reference オプションを指定します。

-reference (C# コンパイラ オプション) | Microsoft Docs

参照設定は -reference オプションを指定することでできるようになるみたいです。

PowerShell から Class1.exe を実行しました。

> .\Class1.exe
Hello World! LibraryClass1
Hello World! LibraryClass2

MSBuild

MSBuild を使用して、プログラムによって C# プログラムをビルドすることもできます。 詳細については、「MSBuild」を参照してください。

csc.exe を使用したコマンド ラインからのビルド | Microsoft Docs

.

Microsoft Build Engine は、アプリケーションをビルドするためのプラットフォームです。 MSBuild とも呼ばれるこのエンジンには、ビルド プラットフォームでソフトウェアを処理およびビルドする方法を制御する、プロジェクト ファイル用の XML スキーマが用意されています。 Visual Studio は MSBuild を使用しますが、MSBuild は Visual Studio に依存しません。 プロジェクト ファイルまたはソリューション ファイルに対して msbuild.exe を実行すると、Visual Studio がインストールされていない環境で、製品の統合とビルドを実行できます。

MSBuild - Visual Studio | Microsoft Docs

MSBuild も csc.exe と同じフォルダーにありました。 プロジェクトファイル(.csproj)、ソリューションファイル(.sln)を作れば MSBuild でコンパイルすることもできます。

プロジェクトファイルやソリューションファイルを作るにはやっぱり Visual Studio があった方が楽なのですけれども。 Visual Studio は遅いし重いしあまりインストールしたくないなー。 そう感じてしまうのは普段 Node.js とか Python とかやってるせいかな。 テキストエディタだけで済むようにしたい。

終わり

ちょっと勉強のために使うにはこれで十分かな。 今回はこれで終わります。

参考

22 May 2019 追記(C# のバージョン)

csc.exe を使うと次のようなメッセージが表示されます。

This compiler is provided as part of the Microsoft (R) .NET Framework, but only supports language versions up to C# 5, which is no longer the latest version. For compilers that support newer versions of the C# programming language, see http://go.microsoft.com/fwlink/?LinkID=533240

csc.exe のコンパイラは C# 5 までしかサポートしていないようです。 新しいバージョンをサポートしているのは Roslyn API になるようです。

What's new in C# 8.0

02/12/2019 ・ 13 minutes to read ・ Contributors

There are many enhancements to the C# language that you can try out already.

…略…

This article was last updated for C# 8.0 preview 5.

What's New in C# 8.0 - C# Guide | Microsoft Docs

.

What's new in C# 7.3

05/16/2018 ・ 6 minutes to read ・ Contributors

There are two main themes to the C# 7.3 release.

What's new in C# 7.3 | Microsoft Docs

この記事を書いている時点では C# 8.0 が preview 5 で、 C# 7.3 が release になっていました。