警告 CS7022 - 程序的入口点是全局代码;忽略 'Program.Main(string[])' 入口点

13

我有一个问题,我的错误列表中出现了这个警告:

Severity Code   Description                     Project File                Line  Suppression State
Warning  CS7022 The entry point of the program  Project DirectoryToProject  23    Active
                is global code; ignoring
                'Program.Main(string[])'
                entry point.

这基本上就是它抛出的地方:

namespace MyProgram
{
    class Program
    {
        static async Task Main(string[] args) => await new Program.MainAsync();
    }
        static async Task MainAsync()
        {.. do stuff.. }
}

这就是引起错误的那行代码。我尝试过对主类进行调整,将其返回类型更改为 void,并在 MainAsync 方法上调用了 GetAwaiter 和 GetResult 方法。
我已经尝试过研究这个错误,但没有什么运气,希望这个问题能帮助其他人...
我目前正在运行 C# 9.0, Visual Studio 2019 Build 版本:16.8.30717.126
MainAsync 在文件中...我正在尝试限制显示的方法数量,因为其中 95% 对于问题来说都没有用... 但问题是,虽然我的应用程序编译通过,但执行程序时会立即退出,好像它不知道从哪里开始...
如果有人遇到类似的情况,请尝试 Hans Passant 所提到的方法:
“这是一个相当糟糕的 C# v9 功能。选择菜单 项目属性生成选项卡,高级按钮语言版本=7.3。您现在应该能够获得一个合理的错误消息,以便您知道需要发表的代码。”
基本上,当我切换回C# 8.0时,我发现有一个不同的文件隐藏起来导致了问题。

6
这是一个相当糟糕的C# v9功能。 项目>属性>生成选项卡,高级按钮>语言版本=7.3。现在您应该可以从您不知道必须发布的代码中获得一个良好的错误消息。 - Hans Passant
@HansPassant 太棒了...它起作用了,是另一个文件搞砸了它,那是一个空的JSON文件...干杯! - Skyhighjinks
4个回答

34
从.NET 5.0开始,我发现这个错误可能是由于在命名空间关键字上方有分号而导致的。无论这是一个错误还是预期行为都超出了我的理解范围,但请确保您没有任何独立的分号,如下所示:
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
; // This will cause CS7022

namespace Tomoe.Commands.Public

请确保检查所有文件,而不仅仅是 Program.cs

显然这是预期的行为;请参阅Stray semicolon above namespace keyword causes warning CS7022 and unexpected exit #53472

简而言之,位于命名空间上方的分号被解释为顶级语句。由于该语句中没有调用任何内容,程序退出。这与以下操作相同:

static void Main() {
    ;
}

在你的 Program.cs 文件中。虽然我认为应该做出一些改变,但是这个设计决策非常合理且易于理解。
根据 GitHub 上的 jcouv,现在这已经成为了一个错误而不是一个警告。希望这个“bug”再也不会困扰我们了!

此外,似乎有不必要的“using”语句甚至会导致这种情况发生... - infl3x
难以置信,居然是一个多余的分号导致浪费了一个小时。这发生在我将我的 asp.net core 项目的 .net 版本从 3.1 切换到 5 的时候。谢谢! - tunafish24
我遇到了同样的问题,就是那个分号。 - Enrico
在他们的主要存储库 https://github.com/dotnet/core/issues/6263 上提交了一个错误报告。 - Lunar
我正在处理这个问题。我正在将一个系统迁移到.NET 5。我已经尝试查找所有的分号。我还更改了系统中其他被称为“Main”的方法的名称。我还发现许多@using在Razor页面中的@model之后定义。然而,CS7022错误仍然存在。 - Gohchi
对我来说,它是在using下面的空括号{}。 - Oren A

7

如果项目中的任何文件(任何文件)具有全局代码,也就是类外语句,就会发生这种情况。


这是一个空的 JSON 文件导致了问题。 - Skyhighjinks
1
这是我的问题。 - Bradyo

3

正如其他人所提到的,这是由C# 9的一个新功能引起的,称为“顶级语句”。该功能使您能够在全局上下文中编写语句,并且编译器将基于此创建自己的Main()。

在我的情况下,我在我的任何文件中的using语句后加了一个分号。据我所知,Visual Studio或编译器不提供任何选项来查找这个“入口点”,除非您像其他人在这个线程中所描述的那样更改任何设置。 我的解决办法是在我的项目中创建另一个“顶级语句入口点”。由于只允许一个,编译器会抱怨这一点。 我只需在我的Program.cs中的using语句后直接添加一个分号即可。因为该文件是编译器处理的最早的文件之一,任何包含“顶级语句”的其他文件都会导致错误。


1

我在以下情况下也见过这个编译器错误。你用顶级语句编写了代码。后来,你决定将那个逻辑吸收到一个Main()方法中。(也许你发现现在需要返回一个async Task,或者你需要修改它以符合公司的编码标准,例如。)尽管以下代码块至少可以在VS2022中编译通过,但它会在Main下方生成带有绿色波浪线的错误:

static void Main()
{
    Console.WriteLine("Inside the Main() method");
    //Do some other work here
}

问题出在哪里呢?方法声明是正确的,它可以运行。但即使这是 Program.cs 文件中唯一的代码,并且即使在项目/解决方案设置中没有指定其他入口点,我们仍然无法获得预期的输出。

Debug console output

即使是Microsoft文档在这种情况下也没有太大的帮助,因为它基本上只是更详细地重复了错误信息。

缺少的是Program类定义。没有它,编译器仍然在寻找顶级语句 - 它找到了static void。然后它找到的下一件事是Main()方法声明,但是它在(不经意的)顶级语句static void之后找到了这个方法。因此,现在错误有点讲得通了。

解决方法是将上面的代码包装在一个Program类中:

class Program
{
    static void Main()
    {
        Console.WriteLine("Inside the Main() method");
    }
}

现在我们得到了预期的输出:

Revised code output


不知道为什么这个没有被点赞。虽然其他答案都是正确的,但这个对于一个一无所知的人来说是最全面的答案! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接