【问题标题】:I added a new class to my project and got an error saying "Program.Main() has more than one entry". Why?我在我的项目中添加了一个新类,并收到一条错误消息,提示“Program.Main() 有多个条目”。为什么?
【发布时间】:2012-07-29 16:06:29
【问题描述】:

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

在 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

【问题讨论】:

  • 你现在有两个Main
  • 这里可能是这样,也可能不是,但是在某些情况下使用NUnit可以添加一个隐式的main()条目(即使第二个main()不在源代码中的任何位置)并导致此症状。参见例如Jesse Q's answer.

标签: c#


【解决方案1】:

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

下面的文章详细解释了为什么,并提供了对我有用的答案 - here

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

&lt;GenerateProgramFile&gt;false&lt;/GenerateProgramFile&gt;

将此添加到您的 &lt;PropertyGroup&gt; 部分并重新编译。

【讨论】:

  • 节省了一天:)
  • 我在NUnit(Linux 上的.NET Core 3.1)遇到了这个问题。
  • 这发生在我添加 NuGet 包 Microsoft.NET.Test.Sdk
  • 如果你使用vscode,使用dotnet new xunit -n Tests新建一个xunit测试项目。这将通过在 .csproj 文件中添加正确的配置来节省您的时间。
  • 我还收到 CS0017 错误消息。我将 false 添加到我的 .cs.proj 文件中,但仍然得到 CS0017。此外,如果编译器自动为新类生成 Main,是否意味着我们不必显式编写 Main?我删除了 Main 来测试它,编译器一直抱怨,直到我把它放回去。
【解决方案2】:

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

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

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

【讨论】:

  • 终于有人指出如何使用 Visual Studio 调整/main(......谁在认真地在命令行编译他们的 C# 项目?)
  • 很好的答案,但我发现我还必须重新启动 VS,然后我的新类才会出现在启动对象选择下。
  • 每次我用自己的 Main 方法创建一个新类时,是否应该在项目属性中选择一个新的启动对象?换句话说,当我在项目中使用Main方法创建一个新类时,我应该将该类指定为启动对象以避免CS0017错误吗?我读到编译器会自动为一个新类生成一个 Main,这应该意味着我们不必显式地编写 Main。我删除了 Main 来测试它,编译器一直抱怨,直到我把它放回去。我是 C#/VSCode 2019 的新手,所以我可能会遗漏一些东西。我在 Java/Eclipse 中没有遇到 CS0017 问题。
  • @AnneBailly,理想情况下,您的项目中应该只有一个 Main 方法。当您编写控制台应用程序时,可执行文件只能有一个入口点(启动方法),这就是Main 方法所表示的。这就是为什么当你有多个时,你必须告诉编译器使用哪一个作为入口点。如果添加其他类,则应使用不同的方法名称,除非您打算在每次编译应用程序时在不同的启动行为之间来回切换(这将是一种奇怪的方法)。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    1. 右键单击您的项目以查看属性。
    2. 转到 Application 选项卡并从 Startup object 下拉列表中选择所需的入口点。

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

    【讨论】:

    • 每次我用自己的 Main 方法创建一个新类时,是否应该在项目属性中选择一个新的启动对象?换句话说,当我在项目中使用Main方法创建一个新类时,我应该将该类指定为启动对象以避免CS0017错误吗?我读到编译器会自动为一个新类生成一个 Main,这应该意味着我们不必显式地编写 Main。我删除了 Main 来测试它,编译器一直抱怨,直到我把它放回去。我是 C#/VSCode 2019 的新手,所以我可能会遗漏一些东西。我在 Java/Eclipse 中没有遇到 CS0017 问题。
    【解决方案5】:

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

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

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

    有关详细信息,请参阅 MSDN 上的 Main() and Command-Line Arguments (C# Programming Guide)

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

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

    (强调我的)

    【讨论】:

      【解决方案6】:

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

      来自MSDN - Main Method

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

      【讨论】:

        【解决方案7】:

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

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

        -main (C# Compiler Options)

        【讨论】:

          【解决方案8】:

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

          【讨论】:

          • 或者,重命名这两个文件夹(以调查为什么会发生这种情况)。例如。可以比较新旧文件夹的内容。
          【解决方案9】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-09-23
            • 1970-01-01
            • 1970-01-01
            • 2018-05-23
            • 1970-01-01
            • 2019-11-16
            • 2020-01-17
            相关资源
            最近更新 更多