不包含适用于入口点的静态“main”方法。

127

今天我开始将我的代码组织成单独的.cs文件,为了让与UI相关的方法能够继续工作,我会在相同的命名空间和公共分部类名称下创建.cs代码,以便这些方法可以互操作。

我的头文件长这样,在包括调用的主要核心文件在内的四个文件中:

public shell()
{
InitializeComponent(); 
}

与UI配合工作的.cs文件的头部区域(似乎是导致这种新冲突的原因):

using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using System.Data.SqlServerCe;
using System.Diagnostics;
using System.Threading;
using System.Collections.Specialized;
using System.Net;
using System.Runtime.InteropServices;
using watin = WatiN.Core;
using WatiN.Core.Native.InternetExplorer;
using System.Web; 


namespace WindowsFormsApplication1
{

    public partial class shell : Form
    {

现在当我试图调试/预览我的应用程序(顺便说一下,这是Visual Studio 2010 Express中的Windows应用程序)时,我收到了以下错误消息:

不包含适合入口点的静态“main”方法

我查看了应用程序属性中的Application->Startup object,但它没有提供任何选项。如何告知应用程序从具有我的InitializeComponent();命令的.cs文件开始?

  • 我已经搜索了很久,但还没有找到解决方案。
  • 每个.cs文件上的属性都设置为“编译”。
  • 我在我的解决方案资源管理器中没有看到App.xaml文件,但我确实看到一个app.config文件。

我还是很新手,这是我尝试使用C#代码进行组织的第一次尝试。


13
你有一个主方法吗? - bobek
1
你需要一个名为main的静态方法,并且签名正确。这样编译器就知道如何启动你的程序。 - David Heffernan
有没有办法我可以手动编程解决方案从哪里开始?我很困惑为什么它找不到静态的“Main”方法,因为我似乎找不到任何指示代码告诉它查找“Main”方法。我对c#非常陌生。 --- [编辑] - @David Hefferman,您能详细说明“正确签名”的含义吗? - atwellpub
6
尝试将类似以下代码段添加到您的项目中:[STAThread] static void Main(string[] args) { Application.Run(new shell()); } 这样做可以确保在单线程单元 (STA) 中运行应用程序,并启动名为shell的新窗体。 - L.B
1
@L.B:将其创建为答案,这样他就可以接受它。 - Joshua
显示剩余3条评论
33个回答

179
我也遇到了这个问题,解决方案非常简单。我在解决方案中添加了一个新的空项目。新添加的项目会自动设置为“控制台应用程序”。但由于添加的项目是一个“空”项目,所以在该新项目中没有“Program.cs”文件(正如预期的那样)。
我只需要将项目属性的“输出”类型更改为“类库”即可。

3
有点过度解决了,我认为。遵循@eyossi的解决方案会更容易。 - TimWagaman
2
你想要一个控制台应用程序还是类库?不要仅仅更改应用程序的类型来修复错误;要知道错误提示的含义。控制台应用程序需要一个入口点(static void main())来确定从哪里开始执行代码;而类库则不需要 - 它们被其他已经在执行的库调用。 - KyleMit
这是@pixaloop建议的过度版本。阅读此答案后,我想起添加空项目时默认将输出更改为控制台。所以我只是去改了它。本来想将其作为答案发布(因为它更简单),但看到有人已经这样做了。 - EternalWulf
谢谢,伙计。那是我最后一个想到的地方! - eaglei22
2
完全不是过度的解决方案。这正是我遇到的确切问题。编译器在我的另外两个项目中寻找main,它们与启动项目一样都是控制台应用程序。在这些“辅助”项目的属性屏幕中将它们更改为类库立即解决了这个问题。 - Ctrl S

115

在项目 > 属性下更改输出类型为“类库”。默认情况下,此设置可能已经设置为“控制台应用程序”。


2
这正是我所做的,完美运作。如果您添加了一个“空”项目,则默认为控制台。 - EternalWulf
谢谢,这对我非常有效。还有一件事我想补充的是,当您右键单击项目并转到属性时,“输出类型”将在“常规”下可用。因此,整个路径基本上是[您的项目名称] > 属性 > 应用程序 > 常规 > 输出类型 - Brookie_C
使用 .NET 7.0/8.0 版本,如果项目类型设置为 类库<OutputType>Library</OutputType>),csc 将会抛出错误。例如:error CS2017: 如果构建模块或库,则无法指定 /main - undefined

42

我遇到了这个错误,通过以下解决方案得以解决。

  1. 右键单击项目
  2. 选择“属性”
  3. 将“输出类型”设置为“类库”。

是的,但你需要另一个项目来调试类库。这样就失去了它的意义。 - Fandango68
适用于我,因为我只在一个实用程序项目上遇到了这个错误,而不是启动项目。 - Joshua Swain
这是正确的。如果你使用类似“Hello World”之类的东西来启动你的项目,并将其删除,那么你必须面对这种情况。 - Martin Zamora

29

试着将这个方法添加到一个类中,看看是否仍然出现错误:

[STAThread]
static void Main()
{
}

在我的情况下,我想要一个控制台应用程序。因此,将入口点添加到我的类中就可以解决问题了。我是VS 2022的新手,但我更喜欢旧的控制台模板。这很令人困惑,控制台应用程序应该直接开箱即用,而不需要编写任何代码。在我看来,这是微软糟糕的用户界面决策。 - Vance McCorkle
这对我很有帮助。我的Main()方法不是静态的。 - tolache
在什么情况下,这将解决问题?显然,它针对构建或项目设置的特定状态...知道具体是什么将会很好。 - undefined

16

编辑 .csproj 文件

<OutputType>Library</OutputType>

干杯!


1
这实际上是有效的,但它必须是 Library(大写 L)。 - detunized
2
它应该是 .net core 的默认设置。https://learn.microsoft.com/fr-fr/visualstudio/msbuild/common-msbuild-project-properties?view=vs-2019 事实证明,当您的项目为<Project Sdk="Microsoft.NET.Sdk.Web">时,在构建期间默认值 Library 会被覆盖为 Exe。 解析 SDK 'Microsoft.NET.Sdk.Web.ProjectSystem'... 属性重新分配:$(OutputType)="Exe"(先前值:"Library") - Romain Hautefeuille
2
不必编辑 .csproj 文件,你可以使用 Visual Studio 2019 中的图形用户界面。1. 在“解决方案资源管理器”中选择项目;2. 点击主工具栏上的“项目” --> “<项目名称> 属性”;3. 输出类型:类库;4. 保存。 - Joshua Swain

14
  1. 选择 App.xaml 文件并显示其属性。将Build Action设置为ApplicationDefinition
  2. 必须将App.xaml及其对应的*.cs文件放置在*.csproj文件的根目录中,即不能放在“Source”文件夹中。

2
这是我的情况。我使用Ctrl+C复制了一个App.xml文件到项目中,构建操作设置为“Page”。 - Jacky Cheng

14

如果您没有名为Program.cs的文件,只需添加一个新类并将其命名为Program.cs

然后粘贴以下代码:

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Windows.Forms;

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

 }

12

在VS 2017中遇到了这个问题,原因是:

static async Task Main(string[] args)

('async main' 特性在C# 7.0中不可用,请使用版本 7.1 或更高版本)

将下面的代码添加到 app.csproj 中:

<LangVersion>latest</LangVersion>

可以解决这个问题。


我也遇到了同样的问题,我认为是因为我最初使用VS2019创建了解决方案,然后尝试在VS2017中打开它。我的应用程序是一个dotnetcore控制台应用程序。 - trebor
在 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 中添加 - user1220497

12

请确保您不要像这样将voidasync一起使用

static async void Main(string[] args)

如果是的话,将void更改为Task,如下所示:
static async Task Main(string[] args)

8
如果您确实有一个 Main 方法但仍然出现此错误,请确保包含 Main 方法的文件具有“生成操作”设置为“编译”,并且“复制到输出目录”设置为“不复制”。

谢谢!也许再过几个小时,我会意识到我无法生成语法错误,因此会去看那里。 - Gerard ONeill

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