Добавил новый класс в мой проект и получил ошибку, скажем, Program.Main() имеет более одной записи, почему?

Проблема заключается в том, что после добавления нового класса ошибка возникла, когда я построил решение. Что может быть неправильным?

В Form1 у меня еще нет кода.

Просто добавлен новый класс:

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();
        }
    }
}

Затем я вижу Program.cs и ошибку в 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

Ответ 1

Программа С# может иметь только одну команду Program.Main(). Main - это первый метод, который запускается при запуске программы, поэтому компилятор должен знать, какой из них является реальным, и он не может, если у вас есть два.

Похоже, вы делаете приложение Windows. Вы должны либо добавить код в существующий основной, либо добавить его к обработчику событий, вызванному вашей основной формой.

Ответ 2

Другие указали, что у вас есть два метода static void Main. Для этого есть два простых исправления: один очевидный и тот, о котором еще не упоминалось особо:

  • Переименуйте одно на что-нибудь еще, например. Main1, NotMain и т.д.
  • Чтобы установить опцию /main компилятора, указанную @Habib, просто щелкните правой кнопкой мыши по проекту node в обозревателе решений, выберите "Свойства", а в разделе "Приложение" выберите "Начальный объект" в раскрывающемся списке.

С решением 2 вы можете иметь идентичные подписи Main(string[] args) в разных классах без компилятора.

Ответ 3

Программа .NET должна иметь только один статический метод Main.

У вас есть два, и компилятор не знает, какой из них использовать.

Переименуйте вставку, если вы не хотите, чтобы она была точкой входа в приложение (в этом случае, переименовать другую) или скомпилируйте передачу приложения с помощью переключателя /main, указав, какой из методов Main использовать.

Подробнее см. Main() и Аргументы командной строки (Руководство по программированию на С#) в MSDN:

Основной метод - это точка входа в консольное приложение С# или приложение Windows. (Библиотеки и службы не требуют использования метода Main в качестве точки входа.). Когда приложение запускается, основным является метод, который вызывается.

В программе С# может быть только одна точка входа. Если у вас есть несколько классов, которые имеют метод Main, вы должны скомпилировать свою программу с опцией /main compiler, чтобы указать, какой Main метод для использования в качестве точки входа. Для получения дополнительной информации см. /Main (Параметры компилятора С#).

(акцент мой)

Ответ 4

У вас есть два основных метода, поэтому вы получаете эту ошибку.

Из MSDN - Основной метод

В программе С# может быть только одна точка входа. Если у вас больше чем один класс с основным методом, вы должны скомпилировать свою программу с опцией /main compiler, чтобы указать, какой основной метод использовать как точка входа.

Ответ 5

Если вы исправили ошибку, и Visual Studio все еще дает вам сообщение об ошибке, стоит удалить выходные папки (по умолчанию "bin" и "obj" ), а затем перестроить проект. В моем случае просто нажатие на "rebuild" не помогло.

Ответ 6

Эта проблема возникла после добавления тестового класса Xunit в мой проект .NET Core 2.1.

Следующая статья дает подробное объяснение ПОЧЕМУ и дает ответ, который работал для меня - здесь.

По сути, компилятор автоматически генерирует Main для нового класса. Вы можете предоставить директиву в вашем файле .csproj, чтобы этого не происходило:

<GenerateProgramFile>false</GenerateProgramFile>

Добавьте это в раздел <PropertyGroup> и перекомпилируйте.

Ответ 7

Иметь два основных метода - это нормально. Если вы получили упомянутое вами сообщение об ошибке, вам нужно только сообщить VS, какой из них вы хотите использовать.

  1. Щелкните правой кнопкой мыши по вашему проекту, чтобы просмотреть свойства.
  2. Перейдите на вкладку "Приложение" и выберите нужную точку входа в раскрывающемся списке "Объект запуска".

Вот пример, где у меня есть две точки входа в зависимости от того, как я хочу протестировать сборку.

enter image description here

enter image description here enter image description here