タイトルの通りのことをしたい。

環境


  • .NET Core 2.2

やりたいこと


一つのプロジェクトに複数のエントリーポイント(Main)が存在する状態で、特定のエントリーポイントを指定してビルドしたい。

例えば、一つのプロジェクトに下記のような2つのクラスが存在するとする。

1
2
3
4
5
6
7
8
9
10
11
12
using System;

namespace csharp
{
class Hoge
{
static void Main()
{
Console.WriteLine("Hoge");
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
using System;

namespace csharp
{
class Piyo
{
static void Main()
{
Console.WriteLine("Piyo");
}
}
}

これをそのままビルドするとエントリーポイントが二つ存在するため、ビルドに失敗する。

具体的には「error CS0017: プログラムで複数のエントリ ポイントが定義されています。エントリ ポイントを含む型を指定するには、/main でコンパイルしてください。」というエラーメッセージが表示される。

エントリーポイントを指定してビルドする


これを解決するにはエントリーポイントを指定してビルドすればよい。公式ドキュメントに書いてある。

dotnet build

具体的には下記のようにする。

1
2
//dotnet build -p:StartupObject=<namespace><class>
dotnet build -p:StartupObject=csharp.Piyo

オプションにStartupObjectを指定し、値に名前空間とクラス名を指定する。例えば前述のPiyoクラスをエントリーポイントとしたい場合は-p:StartupObject=csharp.Piyoとなる。

余談: なんでこんなことがしたいのか


お前はなんで急に.NETCoreとかやりだしたのか?という話なのですが、最近AIZU ONLINE JUDGE(通称AOJ)でプログラミングコンテストの問題を一日数問解くのを日課としているのですが、コースごとに言語を変えながらやってみようと思ったからです。久しぶりにC#でやろうかと思ったのですが、せっかくだし.NETCore使ってみようかなと。

で、問題ごとにC#のプロジェクトを作るわけにもいかないのでエントリーポイントを変えてビルドできたらいいな。と思ったからです。できればdotnet runでデバッグするときにエントリーポイントを指定してやりたいんですが、そっちはさっと調べた限りではみつからなくて、とりあえず暫定でビルドのみやり方を調べたという感じです。

おわり。