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 をこのように変えると、入口の無いクラスだけのプロジェクトでもビルドが通った。
よくある原因
- 入口を消した:
Program.csを空にしたとき、クラス定義だけにしたときのどちらでも CS5001 になった。 - 名前や修飾子の誤り:
static void mainのような小文字のmain、staticの無いvoid Mainは入口と見なされず、同じく CS5001 になった。 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- ライブラリのつもりだった: コンソールアプリのテンプレートは
.csprojに<OutputType>Exe</OutputType>を持つ。
そこに入口の無いクラスだけを置くと CS5001 になる。