I am using dotnet
to build a .NET Core C# project from the command line. The project has multiple classes with a main
method. Thus I get the error:
$ dotnet build
Microsoft (R) Build Engine version 15.1.548.43366
Copyright (C) Microsoft Corporation. All rights reserved.
Test.cs(18,28): error CS0017: Program has more than one entry point defined. Compile with /main to specify the type that contains the entry point.
Build FAILED.
Passing the /main
switch results in the error:
$ dotnet build /main:Test
Microsoft (R) Build Engine version 15.1.548.43366
Copyright (C) Microsoft Corporation. All rights reserved.
MSBUILD : error MSB1001: Unknown switch.
Switch: /main:Test
How can I pass the /main
switch to the dotnet
command?
Starting in C# 9, you don't have to explicitly include a Main method in a console application project. Instead, you can use the top-level statements feature to minimize the code you have to write. In this case, the compiler generates a class and Main method entry point for the application.
Description. The dotnet build command builds the project and its dependencies into a set of binaries. The binaries include the project's code in Intermediate Language (IL) files with a . dll extension.
The dotnet clean command cleans the output of the previous build. It's implemented as an MSBuild target, so the project is evaluated when the command is run. Only the outputs created during the build are cleaned. Both intermediate (obj) and final output (bin) folders are cleaned.
You can edit your csproj to define which class to use (inside a PropertyGroup
):
<StartupObject>foo.Program2</StartupObject>
or specify this MSBuild property on the command line via:
$ dotnet build foo.csproj -p:StartupObject=foo.Program2
where
namespace foo { class Program2{ public static void Main() {} } }
Just to add why calling dotnet
with /main
fails with that error, note that it says "Compile with /main
"; /main
is a parameter for the compiler (csc.exe
), not dotnet build
. dotnet build
will invoke MSBuild.exe
which, in turn, will invoke csc.exe
, but you'll need to tell dotnet build
what the startup class is so it can tell csc.exe
. This is what the accepted answer does.
Alternatively, if you were calling csc.exe
directly, you could pass /main
to it like so...
csc.exe Program.cs Test.cs /main:TestNamespace.Test
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With