Freigeben über


Beheben von Fehlern und Warnungen im Zusammenhang mit einem Programmeinstiegspunkt

Dieser Artikel behandelt die folgenden Compiler-Fehler und -Warnungen:

  • CS0017: Der Programm "Ausgabedateiname" hat mehr als einen Einstiegspunkt definiert. Kompilieren Sie mit /main, um den Typ anzugeben, der den Einstiegspunkt enthält.
  • CS0028: "Funktionsdeklaration" hat die falsche Signatur als Einstiegspunkt.
  • CS0402: "Bezeichner": Ein Einstiegspunkt kann nicht generisch sein oder in einem generischen Typ deklariert werden.
  • CS1555: Für die Main-Methode angegebene "Klasse" konnte nicht gefunden werden.
  • CS1556: "Konstrukt" für die Main-Methode muss eine gültige Klasse oder Struktur sein.
  • CS1557: 'Class' kann nicht für die Main-Methode verwendet werden, da sie sich in einer anderen Ausgabedatei befindet.
  • CS1558: "Class" verfügt nicht über eine geeignete statische Main-Methode.
  • CS1559: 'Object' kann nicht für die Main-Methode verwendet werden, da sie importiert wird.
  • CS2017: "/main" kann nicht angegeben werden, wenn ein Modul oder eine Bibliothek erstellt wird.
  • CS5001: Das Programm enthält keine statische "Main"-Methode, die für einen Einstiegspunkt geeignet ist.
  • CS7022: Der Einstiegspunkt des Programms ist globaler Code; der Einstiegspunkt wird{0} ignoriert.
  • CS8801: In einer Anweisung auf oberster Ebene in diesem Kontext deklarierte lokale Variable oder lokale Funktion '{0}' kann nicht verwendet werden.
  • CS8802: Nur eine Kompilierungseinheit kann Anweisungen auf oberster Ebene aufweisen.
  • CS8803: Anweisungen der obersten Ebene müssen Namespace- und Typdeklarationen vorausgehen.
  • CS8805: Programm mit Anweisungen der obersten Ebene muss eine ausführbare Datei sein.
  • CS8899: Anwendungseinstiegspunkte können nicht mit "UnmanagedCallersOnly" zugeordnet werden.
  • CS8937: Mindestens eine Anweisung auf oberster Ebene muss nicht leer sein.

Main Methodendeklaration

  • CS0017: Der Programm "Ausgabedateiname" hat mehr als einen Einstiegspunkt definiert. Kompilieren Sie mit /main, um den Typ anzugeben, der den Einstiegspunkt enthält.
  • CS0028: "Funktionsdeklaration" hat die falsche Signatur als Einstiegspunkt.
  • CS0402: "Bezeichner": Der Einstiegspunkt darf nicht generisch sein oder in einem generischen Typ enthalten sein.
  • CS1558: "Class" verfügt nicht über eine geeignete statische Main-Methode.
  • CS5001: Das Programm enthält keine statische "Main"-Methode, die für einen Einstiegspunkt geeignet ist.
  • CS8899: Anwendungseinstiegspunkte können nicht mit "UnmanagedCallersOnly" zugeordnet werden.

Ein Programm, das zu einer ausführbaren Datei kompiliert wird, muss eine gültige Main Methode als Einstiegspunkt enthalten. Weitere Informationen finden Sie unter Main() und Befehlszeilenargumente.

Um diese Fehler zu beheben, stellen Sie sicher, dass die Main Methodendeklaration die folgenden Regeln erfüllt:

  • Deklarieren Sie die Main Methode wie static bei einem Rückgabetyp von void, int, oder TaskTask<int>, da für die Laufzeit eine bestimmte Signatur erforderlich ist, um den Einstiegspunkt des Programms (CS0028, CS1558) zu identifizieren. Die Methode kann optional einen string[] Parameter für Befehlszeilenargumente akzeptieren. Wenn Sie den async Modifizierer verwenden, muss der Rückgabetyp Task oder Task<int> sein, und Sie müssen die C#-Sprache Version 7.1 oder höher verwenden.
  • Verschieben Sie die Main Methode aus einem generischen Typ, da die Laufzeit keinen eindeutigen Einstiegspunkt auflösen kann, wenn der enthaltende Typ Typargumente erfordert (CS0402).
  • Entfernen Sie das UnmanagedCallersOnlyAttribute Attribut aus der Main Methode, da Einstiegspunkte aus verwaltetem Code aufgerufen werden können müssen, und UnmanagedCallersOnly beschränkt die Methode nur auf nicht verwaltete Aufrufer (CS8899).
  • Wenn Ihr Code mehrere Main Methoden über verschiedene Typen hinweg enthält, verwenden Sie die StartupObject-Compileroption , um anzugeben, welcher Typ den vorgesehenen Einstiegspunkt (CS0017) enthält. Ohne diese Option kann der Compiler nicht bestimmen, welche Main Methode verwendet werden soll.
  • Stellen Sie sicher, dass das ausführbare Projekt eine Main Methode mit einer korrekten Signatur definiert, da für ein Projekt mit einem OutputType von exe oder winexe ein Einstiegspunkt (CS5001, CS1558) erforderlich ist. Bei dem Methodennamen wird die Groß-/Kleinschreibung beachtet. main qualifiziert sich nicht. Wenn Sie keine ausführbare Datei benötigen, ändern Sie den Ausgabetyp in die Bibliothek.

Hinweis

CS0028 ist eine Ältere Diagnose, die der aktuelle C#-Compiler nicht erzeugt. Moderne Versionen des Compilers melden stattdessen CS1558 oder CS5001, wenn die Methode Main eine ungültige Signatur hat.

Hinweis

CS0017, CS0028, CS0402, CS1558 und CS5001 werden nur während Build - oder Neuerstellungsvorgängen gemeldet. Sie werden während der Eingabe in der IDE nicht als IntelliSense-Diagnose angezeigt.

StartupObject Compileroption

  • CS1555: Für die Main-Methode angegebene "Klasse" konnte nicht gefunden werden.
  • CS1556: "Konstrukt" für die Main-Methode muss eine gültige Klasse oder Struktur sein.
  • CS1557: 'Class' kann nicht für die Main-Methode verwendet werden, da sie sich in einer anderen Ausgabedatei befindet.
  • CS1559: 'Object' kann nicht für die Main-Methode verwendet werden, da sie importiert wird.
  • CS2017: "/main" kann nicht angegeben werden, wenn ein Modul oder eine Bibliothek erstellt wird.

Die StartupObject-Compileroption (auch bekannt als /main) gibt an, welcher Typ die Methode des Main Programms enthält, wenn mehrere Typen eine definieren. Weitere Informationen finden Sie unter StartupObject und Main() und Befehlszeilenargumente.

Um diese Fehler zu beheben, stellen Sie sicher, dass die StartupObject Option auf einen gültigen Typ verweist:

  • Stellen Sie sicher, dass der vollqualifizierte Klassenname, StartupObject den Sie übergeben, einem Typ entspricht, der im Quellcode der aktuellen Kompilierung definiert ist. Der Compiler durchsucht nur die zu kompilierenden Quelldateien, nicht referenzierte Assemblys, nach dem angegebenen Typ (CS1555). Suchen Sie nach Tippfehlern im vollqualifizierten Namen, einschließlich des Namespaces.
  • Stellen Sie sicher, dass der an StartupObject übergebene Bezeichner sich auf einen nicht generischen class oder struct bezieht. Der Compiler erfordert einen konkreten Typ, der eine gültige Main Methode (CS1556) enthalten kann. Schnittstellen, Enumerationen, Delegaten und generische Typen sind keine gültigen Zielobjekte.
  • Verschieben Sie die angegebene Klasse in dieselbe Ausgabedatei wie die aktuelle Kompilierung. Die /main Option löst den Einstiegspunkt in einer einzelnen Ausgabeassembly auf und kann nicht auf Typen verweisen, die in einer anderen Ausgabe kompiliert wurden (CS1557).
  • Stellen Sie sicher, dass der angegebene Typ im Quellcode des aktuellen Projekts und nicht in einer Assembly definiert ist, auf die verwiesen wird. Der Compiler kann keinen importierten Typ als Einstiegspunkt (CS1559) festlegen.
  • Entfernen Sie die /main Option beim Erstellen einer Bibliothek oder eines Moduls. Nur ausführbare Projekte (mit einem OutputType von exe oder winexe) haben Einstiegspunkte (CS2017). Wenn Sie einen Einstiegspunkt benötigen, ändern Sie den Ausgabetyp in eine ausführbare Datei.
  • Stellen Sie sicher, dass der durch StartupObject angegebene Typ eine gültige Main-Methode deklariert. Wenn der Typ vorhanden ist, aber keine geeignete statische Main Methode enthält, generiert der Compiler CS1558. Weitere Informationen finden Sie im Main Abschnitt "Methodendeklaration " für die erforderliche Signatur.

Hinweis

CS1557 und CS1559 sind Legacydiagnosen, die der aktuelle C#-Compiler nicht erzeugt. Die Szenarien, die diese Fehler ausgelöst haben, werden nicht mehr unterstützt oder treten zu selten auf, um die Erkennung zu gewährleisten.

Hinweis

CS1555 und CS1556 werden nur während Build - oder Neuerstellungsvorgängen gemeldet. Sie werden während der Eingabe in der IDE nicht als IntelliSense-Diagnose angezeigt.

Top-Level-Anweisungen

  • CS7022: Der Einstiegspunkt des Programms ist globaler Code; der '{0}' Einstiegspunkt wird ignoriert.
  • CS8801: In einer Anweisung auf oberster Ebene in diesem Kontext deklarierte lokale Variable oder lokale Funktion '{0}' kann nicht verwendet werden.
  • CS8802: Nur eine Kompilierungseinheit kann Anweisungen auf oberster Ebene aufweisen.
  • CS8803: Anweisungen der obersten Ebene müssen Namespace- und Typdeklarationen vorausgehen.
  • CS8805: Programm mit Anweisungen der obersten Ebene muss eine ausführbare Datei sein.
  • CS8937: Mindestens eine Anweisung auf oberster Ebene muss nicht leer sein.

Anweisungen der obersten Ebene ersetzen die explizite Main Methode als Einstiegspunkt des Programms. Weitere Informationen finden Sie in den Anweisungen auf oberster Ebene im C#-Programmierhandbuch und in der Featurespezifikation für Anweisungen auf oberster Ebene .

Um diese Fehler zu beheben, stellen Sie sicher, dass Ihre Verwendung von Anweisungen auf oberster Ebene die folgenden Regeln erfüllt:

  • Konsolidieren Sie alle Anweisungen auf oberster Ebene in einer einzelnen Datei, da nur eine Kompilierungseinheit (Datei) Anweisungen der obersten Ebene (CS8802) enthalten kann. Verschieben Sie beliebigen Code der obersten Ebene aus anderen Dateien in diese einzelne Datei. Strukturieren Sie die verbleibenden Dateien so, dass sie nur Namespace- und Typdeklarationen enthalten.
  • Platzieren Sie alle Anweisungen der obersten Ebene vor einer namespace oder type Deklarationen in der Datei, da der Compiler zuerst Anweisungen der obersten Ebene (CS8803) erfordert. Wenn Sie using Direktiven haben, können diese Direktiven weiterhin Anweisungen auf oberster Ebene vorangehen.
  • Fügen Sie mindestens eine Anweisung ein, die ausführbaren Code enthält, da eine Datei mit nur leeren Anweisungen, Leerzeichen oder Kommentaren nicht als gültiger Einstiegspunkt (CS8937) gilt. Fügen Sie eine Anweisung wie einen Methodenaufruf, eine variable Zuordnung oder einen Ausdruck hinzu, um die Anforderung zu erfüllen.
  • Greifen Sie auf lokale Variablen und lokale Funktionen, die in Anweisungen auf oberster Ebene deklariert sind, nur innerhalb des Kontexts der obersten Ebenenanweisung selbst zu, da diese Deklarationen auf die generierte Einstiegspunktmethode beschränkt sind und für andere Dateien oder für Typmitglieder, die in derselben Datei deklariert sind, nicht sichtbar sind (CS8801). Wenn Sie den Status für alle Dateien freigeben müssen, deklarieren Sie die Variable stattdessen als statisches Feld oder eine Eigenschaft für einen Typ.
  • Legen Sie den OutputType des Projekts auf exe fest, da Anweisungen der obersten Ebene einen Einstiegspunkt definieren und Einstiegspunkte nur in ausführbaren Projekten (CS8805) gültig sind. Wenn Sie eine Bibliothek erstellen, entfernen Sie die Anweisungen der obersten Ebene, und verwenden Sie stattdessen Typen und Methoden.
  • Entfernen oder umbenennen Sie eine explizite Main Methode, wenn Anweisungen der obersten Ebene vorhanden sind, da der Compiler die Anweisungen der obersten Ebene als Einstiegspunkt behandelt und jede Main Methode ignoriert, wodurch eine Warnung (CS7022) erzeugt wird. Wenn Sie eine explizite Main Methode verwenden möchten, verschieben Sie den Code der Anweisung der obersten Ebene in diese Methode, und entfernen Sie die Anweisungen auf oberster Ebene.