できない.dev

C#「CS5001: Program does not contain a static 'Main' method」の原因と直し方

CS5001: Program does not contain a static 'Main' method は、static な Main かトップレベルステートメントを置けば直る。
ライブラリなら OutputType を Library にする。
Exe のプロジェクトに入口が無いと出る。

公開:

要約

dotnet new console で作ったプロジェクトの Program.cs を空にして dotnet build すると、コンパイルの最後で止まった。
.NET SDK 8.0.426 では次のように出て、終了コードは 1 だった。

CSC : error CS5001: Program does not contain a static 'Main' method suitable for an entry point [App.csproj]

CS5001 は、実行ファイル(Exe)を作るプロジェクトなのに、プログラムの入口が見つからないという意味だ。
入口になるのは、static な Main メソッドか、トップレベルステートメント(Main を書かずにファイルの先頭から処理を書く形)のどちらかである。
どちらも無いと、プロジェクト全体に対してこのエラーが出る。
そのため行番号は付かない。公式のエラー一覧(新しいタブで開く)によると、CS5001 はビルド(またはリビルド)のときにだけ報告される。

解決策

1. 入口を置く

トップレベルステートメントなら、ファイルに処理を書くだけでよい。

Console.WriteLine("Hello");

Main を書くなら、static を付けて大文字で始める。

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

2. 非同期の Main は Task を返す

static async Task Main(string[] args)
{
    await Task.Delay(1);
    Console.WriteLine("Hello");
}

戻り値を Task にするとビルドが通り、dotnet run で Hello が出た。
許される Main の形はMain() and command-line arguments(新しいタブで開く)にまとまっている。

3. ライブラリなら OutputType を変える

<OutputType>Library</OutputType>

.csproj をこのように変えると、入口の無いクラスだけのプロジェクトでもビルドが通った。

よくある原因

  1. 入口を消した: Program.cs を空にしたとき、クラス定義だけにしたときのどちらでも CS5001 になった。
  2. 名前や修飾子の誤り: static void main のような小文字の main、static の無い void Main は入口と見なされず、同じく CS5001 になった。
  3. async void Main: static async void Main では、次の 2 つが同時に出た。
Program.cs(4,23): error CS4009: A void or int returning entry point cannot be async
CSC : error CS5001: Program does not contain a static 'Main' method suitable for an entry point
  1. ライブラリのつもりだった: コンソールアプリのテンプレートは .csproj に <OutputType>Exe</OutputType> を持つ。
    そこに入口の無いクラスだけを置くと CS5001 になる。