Enthält keine statische 'Haupt'-Methode, die für einen Einstiegspunkt geeignet ist

79

Ich begann meinen Code heute in getrennten CS-Dateien zu organisieren. Damit die Methoden, die mit der Benutzeroberfläche zusammenarbeiten, weiterhin funktionieren, erstellte ich den CS-Code unter demselben Namespace und demselben öffentlichen Teilklassennamen, damit die Methoden dies konnten interoperabel sein.

Mein Header sieht in vier Dateien so aus, einschließlich meiner Hauptkerndatei, die Folgendes aufruft:

public shell()
{
InitializeComponent(); 
}

Header-Bereich von CS-Dateien, die mit der Benutzeroberfläche funktionieren (und diesen neuen Konflikt zu verursachen scheinen):

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
    {

Wenn ich jetzt versuche, meine Anwendung zu debuggen / in der Vorschau anzuzeigen (übrigens ist dies eine Windows-Anwendung in Visual Studio 2010 Express), wird folgende Fehlermeldung angezeigt:

Enthält keine statische 'Haupt'-Methode, die für einen Einstiegspunkt geeignet ist

Ich habe in den Anwendungseigenschaften unter Anwendung-> Startobjekt nachgesehen, aber es bietet mir keine Optionen. Wie kann ich die Anwendung informieren, damit sie mit der CS-Datei beginnt, die meine InitializeComponent () enthält? Befehl?

  • Ich habe mich bisher ohne Lösung umgesehen.
  • Die Eigenschaften jeder CS-Datei sind auf "Kompilieren" festgelegt.
  • Ich sehe keine App.xaml-Datei in meinem Solutions Explorer, aber eine app.config-Datei.

Ich bin noch sehr neu und dies ist mein erster Versuch einer Organisationsmethode mit C # -Code.

atwellpub
quelle
12
Hast du eine Hauptmethode?
Bobek
Um ehrlich zu sein, sehe ich nirgendwo in meinem Code eine Methode namens Main. Ich arbeite jetzt auch seit ein paar Monaten an diesem Projekt.
Atwellpub
1
Sie benötigen eine statische Methode mainmit der richtigen Signatur. So weiß der Compiler, wie man ein Programm startet.
David Heffernan
4
Versuchen Sie, Ihrem Projekt so etwas hinzuzufügen[STAThread] static void Main(string[] args) { Application.Run(new shell()); }
LB
1
@LB: Erstelle das als Antwort, damit er es akzeptieren kann.
Joshua

Antworten:

125

Ich habe mir auch dieses Problem angesehen, und in meinem Fall war die Lösung zu einfach. Ich habe der Lösung ein neues leeres Projekt hinzugefügt. Das neu hinzugefügte Projekt wird automatisch als Konsolenanwendung festgelegt. Da es sich bei dem hinzugefügten Projekt jedoch um ein 'leeres' Projekt handelte, war in diesem neuen Projekt keine Program.cs vorhanden. (Wie erwartet)

Ich musste lediglich den Ausgabetyp der Projekteigenschaften in Klassenbibliothek ändern

Arne
quelle
Ein bisschen übertrieben von einer Lösung, denke ich. Es wäre viel einfacher, der Lösung von @ eyossi zu folgen.
TimWagaman
Aber wollten Sie eine Konsolenanwendung oder eine Klassenbibliothek? Ändern Sie nicht nur den Anwendungstyp, um einen Fehler zu beheben. wissen, was der Fehler Ihnen sagt. Konsolenanwendungen benötigen einen Einstiegspunkt ( static void main()), um zu bestimmen, wo mit der Ausführung von Code begonnen werden soll. Klassenbibliotheken tun dies nicht - sie werden von anderen Bibliotheken aufgerufen, die bereits ausgeführt werden.
KyleMit
Dies ist die Overkill-Version dessen, was @pixaloop vorschlägt. Nachdem ich diese Antwort gelesen hatte, fiel mir ein, dass beim Hinzufügen eines leeren Projekts die Ausgabe standardmäßig an Console gesendet wird. Also habe ich es einfach geändert. Wollte es als Antwort posten (da es viel einfacher ist), sah aber, dass es bereits jemand anderes tat.
EternalWulf
Danke, Mann. Das wäre der letzte Ort gewesen, an dem ich gesucht hätte!
eaglei22
Überhaupt nicht übertrieben. Dies war genau das Problem in meiner Situation. Der Compiler suchte mainin meinen beiden anderen Projekten nach einer Konsolenanwendung, genau wie das StartUp-Projekt. Durch Ändern dieser beiden "unterstützenden" Projekte in " Klassenbibliothek" in ihrem Eigenschaftenbildschirm wurde dies sofort behoben.
Strg S
80

Ändern Sie den Ausgabetyp unter Projekt> Eigenschaften in den einer „Klassenbibliothek“. Standardmäßig wurde diese Einstellung möglicherweise auf eine „Konsolenanwendung“ festgelegt.

Automatisierungstest
quelle
1
Genau das habe ich getan, funktioniert perfekt. Wenn Sie ein 'Leer'-Projekt hinzugefügt haben, wird standardmäßig die Konsole verwendet.
EternalWulf
21

Versuchen Sie, diese Methode einer Klasse hinzuzufügen, und prüfen Sie, ob der Fehler weiterhin angezeigt wird:

[STAThread]
static void Main()
{
}
Eyossi
quelle
12

Ich hatte diesen Fehler und löste ihn mit dieser Lösung.

  1. Klicken Sie mit der rechten Maustaste auf das Projekt
  2. Wählen Sie "Eigenschaften"
  3. Stellen Sie "Ausgabetyp" auf "Klassenbibliothek".
Ali Ahmadi
quelle
Ja, aber Sie benötigen ein anderes Projekt, um die Klassenbibliothek zu debuggen. Besiegt den Zweck
Fandango68
11

Wenn Sie keine Datei mit dem Namen haben Program.cs, fügen Sie einfach eine neue Klasse hinzu und benennen Sie sie Program.cs.

Fügen Sie dann diesen Code ein:

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

 }
Rom
quelle
9
  1. Wählen Sie App.xaml und zeigen Sie seine Eigenschaften an. Setzen Sie die Build-Aktion auf ApplicationDefinition .
  2. App.xaml und die zugehörige * .cs-Datei müssen im Stammverzeichnis der * .csproj-Datei abgelegt werden, dh nicht in einem "Quell" -Ordner.
Roman Volkov
quelle
1
Dies ist bei mir der Fall. Ich habe Strg + C eine App.xml in das Projekt kopiert und die Build-Aktion wurde auf "Seite" gesetzt.
Jacky Cheng
7

Wenn Sie eine Hauptmethode haben, aber dennoch diesen Fehler erhalten, stellen Sie sicher, dass für die Datei mit der Hauptmethode "Build-Aktion" auf "Kompilieren" und "In Ausgangsverzeichnis kopieren" auf "Nicht kopieren" gesetzt ist.

simonbs
quelle
Vielen Dank! Vielleicht würde ich in ein paar Stunden feststellen, dass ich keinen Syntaxfehler erzeugen konnte und daher dort
nachschaute
5

Für mich wurde der Fehler tatsächlich durch "Feature 'async main' ist in C # 7.0 nicht verfügbar. Bitte verwenden Sie die Sprachversion 7.1 oder höher" erzeugt. Dieses Problem führte zu der Meldung "Enthält keine statische Hauptmethode, die für einen Einstiegspunkt geeignet ist" in der Fehlerliste. Im Ausgabefenster wurde jedoch der Fehler "Nicht verfügbar" angezeigt. Um dies zu korrigieren, habe ich die Sprachversion unter "Erweiterte Build-Einstellungen" von "C # neueste Nebenversion (Standard)" in "C # neueste Nebenversion (neueste Version)" geändert.

Mondhund 2112
quelle
Guter Fang. Das eigentliche Versionsproblem wird nur im Ausgabefenster angegeben
int-i
5

Bearbeiten Sie die .csproj-Datei

<OutputType>Library</OutputType>

Prost !

bereket gebredingle
quelle
1
Das funktioniert tatsächlich, aber es muss Library(mit einem Kapital L) sein
verstimmt
Es soll der Standardwert in .net core docs.microsoft.com/fr-fr/visualstudio/msbuild/… sein. Es stellt sich heraus, dass wenn Ihr Projekt <Project Sdk = "Microsoft.NET.Sdk.Web"> der Standardwert ist Die Bibliothek wird während der Erstellung auf Exe überschrieben. SDK 'Microsoft.NET.Sdk.Web.ProjectSystem' auflösen ... Neuzuweisung von Eigenschaften: $ (OutputType) = "Exe" (vorheriger Wert: "Library")
Romain Hautefeuille
4

Hey, ich habe den gleichen Fehler und die Lösung für diesen Fehler ist einfach Capital M anstelle von Small M zu schreiben. Beispiel: - static void Main () Ich hoffe, es hilft.

Chetan Soni
quelle
3

Hatte dieses Problem in VS 2017 verursacht durch:

statische asynchrone Aufgabe Main (string [] args)

(Die Funktion 'async main' ist in C # 7.0 nicht verfügbar. Bitte verwenden Sie die Sprachversion 7.1 oder höher. )

Hinzufügen

<LangVersion>latest</LangVersion>

zu app.csproj geholfen.

Tom
quelle
Ich hatte das gleiche, denke ich, weil ich die Lösung zunächst mit VS2019 erstellt und dann versucht habe, sie in VS2017 zu öffnen. Meins ist eine Dotnetcore-Konsolen-App.
Trebor
2

Sieht aus wie ein Windows Forms-Projekt, das versucht, ein Startformular zu verwenden, aber aus irgendeinem Grund sind die Projekteigenschaften auf "Start" als "Haupt" festgelegt.

Wenn Sie das Anwendungsframework aktiviert haben, können Sie möglicherweise nicht sehen, dass Main aktiv ist (dies ist eine ungültige Konfiguration).

Joshua
quelle
Ich würde gerne etwas mehr über die Application Framework-Einstellungen und alles erfahren, was die Software dazu veranlassen könnte, nach Main () zu suchen, wenn eine Main-Methode nirgendwo zu existieren schien.
Atwellpub
Ich glaube, die Application Framework-Einstellung gilt nur für VB.NET. C # Forms-Anwendungen haben immer "main" als Einstiegspunkt.
A. Wilson
2

Salaam, ich habe beide Visual Studio 2017undVisual Studio 2019

Visual Studio 2019 zeigt diesen Fehler nicht an, 2017 jedoch. Versuchen Sie, Visual Studio 2019 zu installieren.


Visual Studio 2017

Visual Studio 2017


Visual Studio 2019

Visual Studio 2019

Ali Jamal
quelle
1

Wenn Sie zulassen möchten, dass Parameter über den Befehl angegeben werden, müssen sie folgendermaßen aussehen:

 [STAThread]
 static void Main(params string[] paramaters)
 {

Sie können nicht mehr als einen Parameter angeben, da dies sonst auch den oben gemeldeten Fehler verursacht.

Gerrie Pretorius
quelle
1

Für einige andere, die hierher kommen:

In meinem Fall hatte ich eine .csproj aus einem Beispielprojekt kopiert, das <EnableDefaultCompileItems>false</EnableDefaultCompileItems>ohne die Datei Program.cs enthalten war . Die Korrektur bestand darin, entweder EnableDefaultCompileItems zu entfernen oder Program.cs explizit in die Kompilierung aufzunehmen

Madison Haynie
quelle
1

Wenn Ihre Hauptklasse gelöscht wurde, fügen Sie eine neue Klasse hinzu, deren Name als Main.cs festgelegt ist, und schädigen Sie diesen Code, oder wenn das Porblem im Fenster das gleiche Problem darstellt

using System;
using System.Collections.Generic;
using System.Linq;
using Foundation;
using UIKit;

namespace your_PKG_name.iOS
{
       public class Application
        {
            // This is the main entry point of the application.
            static void Main(string[] args)
            {
                // if you want to use a different Application Delegate class from "AppDelegate"
                // you can specify it here.
                UIApplication.Main(args, null, "AppDelegate");

            }
        }
}
Yash Patel
quelle
H'whoops, ich habe versehentlich meine Hauptdatei aus dem iOS-Projekt gezogen. Vielen Dank
Dan Beaulieu
1

Wenn Sie ein Klassenbibliotheksprojekt verwenden, legen Sie die Klassenbibliothek als Ausgabetyp in den Eigenschaften im Anwendungsabschnitt des Projekts fest.

Manveer Singh
quelle
1

Führen Sie die folgenden Schritte aus, nachdem Sie den obigen Code in Program.cs eingefügt haben:

  1. Klicken Sie mit der rechten Maustaste auf das Projekt

  2. Wählen Sie "Eigenschaften"

  3. Stellen Sie "Ausgabetyp" auf "Windows-Anwendung"

  4. Startobjekt: namepace.Program

Siddhi Dilip Kamat
quelle
0

Auch ich habe mich diesem Problem gestellt. Dann wurde mir klar, dass ich Konsolenanwendung (Paket) anstelle von Konsolenanwendung auswählte.

Subrahmanya Prasad
quelle
0

Ich benutze Visual Studio und hatte auch dieses Problem. Es hat einige Zeit gedauert, aber in meinem Programm wurde es verursacht, weil ich versehentlich eine Klasse mit dem Namen "Programm" gelöscht habe, die automatisch generiert wird.

MaChaToc
quelle
0

Für zukünftige Leser, die dasselbe Problem mit der Windows Forms-Anwendung hatten, besteht eine Lösung darin, diese Zeilen zu Ihrer Haupt- / Startformularklasse hinzuzufügen:

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MyMainForm());
    }

Gehen Sie dann zu Projekteigenschaften> Anwendung> Startobjekt-Dropdown-Liste. Der Namespace sollte angezeigt werden. MyMainForm, wählen Sie ihn aus, bereinigen Sie ihn und erstellen Sie die Lösung. Und es sollte funktionieren.

mürrisch
quelle
0

Überprüfen Sie, ob das Projekt als "Startprojekt" festgelegt ist.

Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie "Als Startprojekt festlegen" aus dem Menü.

James Wierzba
quelle
0

Wenn Sie wie ich sind, haben Sie möglicherweise mit einer Klassenbibliothek begonnen und diese dann auf eine Konsolenanwendung umgestellt. Wenn ja, ändern Sie dies ...

namespace ClassLibrary1
{
    public class Class1
    {
    }
}

Dazu ...

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}
Adam Cox
quelle
0

Ein gültiger Eintrag sieht folgendermaßen aus:

public static class ConsoleProgram
    {
        [STAThread]
        static void Main()
        {
            Console.WriteLine("Got here");
            Console.ReadLine();
        }
    }

Ich hatte Probleme beim Schreiben einer Webanwendung, aber wegen der schrecklichen Ladezeit wollte ich dasselbe Projekt schnell in eine Konsolenanwendung konvertieren und schnelle Methodentests durchführen, ohne die gesamte Lösung zu laden.

Mein Einstiegspunkt wurde in /App_Code/Main.cs platziert, und ich musste Folgendes tun:

  1. Stellen Sie Projekt -> Eigenschaften -> Anwendung -> Ausgabetyp = Konsolenanwendung ein
  2. Erstellen Sie die Datei /App_Code/Main.cs
  3. Fügen Sie den obigen Code hinzu (und verweisen Sie auf die Methoden in meinem Projekt).
  4. Klicken Sie mit der rechten Maustaste auf die Datei Main.cs -> Eigenschaften -> Build Action = Compile

Danach kann ich die Ausgabe (wie in Schritt 1 erwähnt) auf Klassenbibliothek einstellen, um die Website zu starten, oder auf Konsolenanwendung, um in den Konsolenmodus zu wechseln.

Warum habe ich das anstelle von 2 separaten Projekten gemacht?

Einfach, weil ich Verweise auf Entity Framework und andere spezifische Verweise hatte, die Probleme beim Ausführen von zwei separaten Projekten verursachten.

Für einfachere Lösungen würde ich immer noch 2 separate Projekte empfehlen, da die Konsolenausgabe hauptsächlich Testcode ist und Sie wahrscheinlich nicht riskieren möchten, dass der Produktionscode ausgeht.

Peter Kindberg
quelle