Добавил новый класс в мой проект и получил ошибку, скажем, 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, какой из них вы хотите использовать.
- Щелкните правой кнопкой мыши по вашему проекту, чтобы просмотреть свойства.
- Перейдите на вкладку "Приложение" и выберите нужную точку входа в раскрывающемся списке "Объект запуска".
Вот пример, где у меня есть две точки входа в зависимости от того, как я хочу протестировать сборку.
![enter image description here]()
![enter image description here]()