38

问题是,在我添加了新类之后,当我构建解决方案时出现了错误。有什么问题?

在 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
4

9 回答 9

53

在将xUnit测试类添加到我的 .NET Core 2.1 项目后,我遇到了这个问题。

下面的文章详细解释了原因,并提供了对我有用的答案 -这里

基本上,编译器会自动为新类生成一个Main。您可以在 .csproj 文件中提供指令以防止这种情况发生:

<GenerateProgramFile>false</GenerateProgramFile>

将此添加到您的<PropertyGroup>部分并重新编译。

于 2019-01-24T15:17:12.070 回答
27

其他人指出您有两个静态 void Main 方法。有两个简单的解决方法,一个是明显的,一个是尚未特别提及的:

  1. 将 one 重命名为其他任何名称,例如Main1,NotMain等。
  2. 要设置Habib 提到的/main编译器选项,只需右键单击解决方案资源管理器中的项目节点,选择属性,然后在应用程序部分的下拉列表中选择“启动对象”。

使用解决方案 2,您可以在不同的类中拥有相同Main(string[] args)的签名,而无需编译器抱怨。

于 2013-08-14T21:48:07.610 回答
20

AC# 程序只能有一个 Program.Main()。main 是程序启动时运行的第一个方法,所以编译器需要知道哪个是真正的,如果你有两个它就不能。

看起来您正在制作一个 Windows 应用程序。您应该将代码添加到现有主窗体中,或者将其添加到主窗体触发的事件处理程序中。

于 2012-07-31T19:46:07.503 回答
12

有两个Main方法就可以了。如果您收到您提到的错误,那么您只需告诉 Visual Studio 您要使用哪一个。

  1. 右键单击您的项目以查看属性。
  2. 转到“应用程序”选项卡,然后从“启动对象”下拉列表中选择所需的入口点。

这是一个示例,其中我有两个入口点,具体取决于我要如何开发测试程序集。

在此处输入图像描述

在此处输入图像描述 在此处输入图像描述

于 2019-01-26T07:53:53.803 回答
9

.NET 程序应该只有一个静态Main方法。

你有两个,编译器不知道使用哪一个。

重命名粘贴的一个,除非您希望成为应用程序的入口点(在这种情况下,重命名另一个),或者使用指定要使用的方法的开关来编译应用程序/main传递。Main

有关更多详细信息,请参阅MSDN 上的Main() 和命令行参数(C# 编程指南) :

Main 方法是 C# 控制台应用程序或 Windows 应用程序的入口点。(库和服务不需要 Main 方法作为入口点。)。启动应用程序时,Main 方法是调用的第一个方法。

C# 程序中只能有一个入口点。如果您有多个具有 Main 方法的类,则必须使用 /main 编译器选项来编译程序,以指定将哪个 Main 方法用作入口点。有关详细信息,请参阅 /main(C# 编译器选项)。

(强调我的)

于 2012-07-31T19:44:12.323 回答
4

您有两个主要方法,这就是您收到此错误的原因。

来自MSDN - 主要方法

C# 程序中只能有一个入口点。如果您有多个具有 Main 方法的类,则必须使用 /main 编译器选项来编译程序,以指定将哪个 Main 方法用作入口点。

于 2012-07-31T19:46:09.390 回答
3

可以通过添加StartupObject到您的 .cspoj来选择入口点

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

请参见-main(C# 编译器选项)

于 2020-11-15T11:17:05.673 回答
2

如果您已修复错误并且 Visual Studio 仍然给您错误消息,则值得删除输出文件夹(默认情况下为“bin”和“obj”),然后重新构建项目。就我而言,只需单击“重建”并没有帮助。

于 2018-02-20T11:30:10.827 回答
2

当您在项目中添加一个新类并编写Main方法时,当您当时运行代码时,它会显示“找到多个 Main 方法”之类的错误,那么您只需要:

  1. 右键单击“解决方案资源管理器”中显示的项目名称,然后
  2. 进入Application并在Startup object下拉菜单中选择您要运行的类。如果您在其中找不到您的类名,那么只需重新启动您的 IDE 并再次按照上述步骤操作。
于 2020-01-10T09:39:47.837 回答