I added a new class to my project and got an error saying "Program.Main() has more than one entry". Why?

Viewed 88754

The problem is that after I added the new class, the error came up when I did build the solution. What can be wrong?

In Form1, I don’t have any code yet.

I just added a new class:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenHardwareMonitor.Hardware;

namespace OpenHardwareMonitorReport
{

    class Program
    {

        static void Main(string[] args)
        {
            Computer computer = new Computer();
            computer.Open();

            var temps = new List<decimal>();
            foreach (var hardware in computer.Hardware)
            {
                if (hardware.HardwareType != HardwareType.CPU)
                    continue;
                hardware.Update();
                foreach (var sensor in hardware.Sensors)
                {
                    if (sensor.SensorType != SensorType.Temperature)
                    {
                        if (sensor.Value != null)
                            temps.Add((decimal)sensor.Value);
                    }
                }
            }

            foreach (decimal temp in temps)
            {
                Console.WriteLine(temp);
            }
            Console.ReadLine();
        }
    }
}

Then I see file Program.cs and the error on Main():

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace NvidiaTemp
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

Error 2  Program 'D:\C-Sharp\NvidiaTemp\NvidiaTemp\NvidiaTemp\obj\x86\Debug\NvidiaTemp.exe' has more than one entry point defined: 'NvidiaTemp.Program.Main()'. Compile with /main to specify the type that contains the entry point. D:\C-Sharp\NvidiaTemp\NvidiaTemp\NvidiaTemp\Program.cs  14  21  NvidiaTemp
10 Answers

I experienced this issue after adding an xUnit test class to my .NET Core 2.1 project.

The following article gives a detailed explanation of why, and provided the answer that worked for me - here.

Basically, the compiler automatically generates a Main for the new class. You can provide a directive in your .csproj file to keep this from happening:

<GenerateProgramFile>false</GenerateProgramFile>

Add this to your <PropertyGroup> section and recompile.

Having two Main methods is just fine. If you receive the error you mentioned then you need only to tell Visual Studio which one you'd like to use.

  1. Right-click on your project to view the properties.
  2. Go to the Application tab and choose the entry point you desire from the Startup object dropdown.

Here's an example where I have two entry points depending on how I want to dev-test the assembly.

Enter image description here

Enter image description here Enter image description here

When you add a new class in your project and also you write the Main method, and when you run your code at that time it shows the error like "More than one Main method found", then you just need to:

  1. Right click on your project name which is shown in "Solution Explorer" then
  2. go into Application and in the Startup object dropdown menu choose your class which you want to run. If you don't find your class name in it, then simply just restart your IDE and again follow the above steps.

An entry point may be chosen by add StartupObject into your .cspoj

<StartupObject>MyApplication.Core.Program</StartupObject>

See -main (C# Compiler Options)

Did you recently add unit testing (XUnit) to your project?
Then this is the reason for you error message. You can read about the details in this blog post.

The solution is simple:
Edit your .csproj file and add a GenerateProgramFile property with value false to a general PropertyGroup (one that has no conditions):

Example:

<PropertyGroup>
  <TargetFramework>netcoreapp2.2</TargetFramework>
  <IsPackable>false</IsPackable>
  <GenerateProgramFile>false</GenerateProgramFile>
</PropertyGroup>
Related