Fouten en waarschuwingen met betrekking tot een programmainvoerpunt oplossen

In dit artikel worden de volgende compilerfouten en -waarschuwingen behandeld:

  • CS0017: De uitvoerbestandsnaam van het programma heeft meer dan één ingangspunt gedefinieerd. Compileer met /main om het type op te geven dat het toegangspunt bevat.
  • CS0028: 'functiedeclaratie' heeft de verkeerde handtekening als invoerpunt
  • CS0402: 'id': een toegangspunt kan niet algemeen of in een algemeen type zijn
  • CS1555: Kan klasse niet vinden die is opgegeven voor de main-methode
  • CS1556: 'construct' opgegeven voor de main-methode moet een geldige klasse of struct zijn
  • CS1557: Kan klasse niet gebruiken voor de main-methode omdat deze zich in een ander uitvoerbestand bevindt
  • CS1558: 'klasse' heeft geen geschikte statische Main-methode
  • CS1559: Kan object niet gebruiken voor de main-methode omdat het is geïmporteerd
  • CS2017: Kan /main niet opgeven als u een module of bibliotheek bouwt
  • CS5001: Het programma bevat geen statische 'Main'-methode die geschikt is voor een toegangspunt
  • CS7022: Het toegangspunt van het programma is globale code, waarbij het invoerpunt '{0}' wordt genegeerd.
  • CS8801: Kan geen lokale variabele of lokale functie gebruiken die{0} in deze context is gedeclareerd in een instructie op het hoogste niveau.
  • CS8802: Slechts één compilatie-eenheid kan instructies op het hoogste niveau bevatten.
  • CS8803: Instructies op het hoogste niveau moeten voorafgaan aan naamruimte- en typedeclaraties.
  • CS8805: Programma met behulp van instructies op het hoogste niveau moet een uitvoerbaar bestand zijn.
  • CS8899: Toegangspunten voor toepassingen kunnen niet worden toegeschreven aan 'UnmanagedCallersOnly'.
  • CS8937: Ten minste één verklaring op het hoogste niveau moet inhoud hebben.

Main methodedeclaratie

  • CS0017: De uitvoerbestandsnaam van het programma heeft meer dan één ingangspunt gedefinieerd. Compileer met /main om het type op te geven dat het toegangspunt bevat.
  • CS0028: 'functiedeclaratie' heeft de verkeerde handtekening als invoerpunt
  • CS0402: 'id': een toegangspunt kan niet algemeen of in een algemeen type zijn
  • CS1558: 'klasse' heeft geen geschikte statische Main-methode
  • CS5001: Het programma bevat geen statische 'Main'-methode die geschikt is voor een toegangspunt
  • CS8899: Toegangspunten voor toepassingen kunnen niet worden toegeschreven aan 'UnmanagedCallersOnly'.

Een programma dat naar een uitvoerbaar bestand compileert, moet een geldige Main methode bevatten als toegangspunt. Zie Main() en opdrachtregelargumenten voor meer informatie.

Als u deze fouten wilt corrigeren, moet u ervoor zorgen dat uw Main methodedeclaratie de volgende regels volgt:

  • Declareer de Main methode als static met een retourtype void, intof TaskTask<int>, omdat voor de runtime een specifieke handtekening is vereist om het toegangspunt van het programma te identificeren (CS0028, CS1558). De methode kan desgewenst een string[] parameter accepteren voor opdrachtregelargumenten. Als u de async wijzigingsfunctie gebruikt, moet het retourtype zijn Task of Task<int>, en moet u zich richten op C#-taal versie 7.1 of hoger.
  • Verplaats de Main methode uit elk generiek type, omdat de runtime geen uniek toegangspunt kan bepalen wanneer het omvattende type type-argumenten vereist (CS0402).
  • Verwijder het UnmanagedCallersOnlyAttribute kenmerk uit de Main methode, omdat toegangspunten kunnen worden aangeroepen vanuit beheerde code en UnmanagedCallersOnly de methode beperkt tot alleen niet-beheerde aanroepers (CS8899).
  • Wanneer uw code meerdere Main methoden voor verschillende typen bevat, gebruikt u de optie StartupObject compiler om op te geven welk type het beoogde toegangspunt bevat (CS0017). Zonder deze optie kan de compiler niet bepalen welke Main methode moet worden gebruikt.
  • Controleer of uw uitvoerbare project een Main methode met een juiste handtekening definieert, omdat voor een project met een OutputType van exe of winexe een ingangspunt is vereist (CS5001, CS1558). De naam van de methode is hoofdlettergevoelig - main komt niet in aanmerking. Als u geen uitvoerbaar bestand nodig hebt, wijzigt u het uitvoertype in de bibliotheek.

Opmerking

CS0028 is een verouderde diagnose die de huidige C#-compiler niet produceert. Moderne versies van het compilerrapport CS1558 of CS5001 in plaats daarvan wanneer de Main methode een ongeldige handtekening heeft.

Opmerking

CS0017, CS0028, CS0402, CS1558 en CS5001 worden alleen gerapporteerd tijdens build - of herbouwbewerkingen . Ze worden niet weergegeven als IntelliSense-diagnostische gegevens terwijl u in de IDE typt.

StartupObject compileroptie

  • CS1555: Kan klasse niet vinden die is opgegeven voor de main-methode
  • CS1556: 'construct' opgegeven voor de main-methode moet een geldige klasse of struct zijn
  • CS1557: Kan klasse niet gebruiken voor de main-methode omdat deze zich in een ander uitvoerbestand bevindt
  • CS1559: Kan object niet gebruiken voor de main-methode omdat het is geïmporteerd
  • CS2017: Kan /main niet opgeven als u een module of bibliotheek bouwt

Met de optie StartupObject-compiler (ook wel bekend als /main) wordt opgegeven welk type de methode van Main het programma bevat wanneer meerdere typen een methode definiëren. Zie StartupObject en Main() en opdrachtregelargumenten voor meer informatie.

Als u deze fouten wilt corrigeren, controleert u of de StartupObject optie verwijst naar een geldig type:

  • Controleer of de volledig gekwalificeerde klassenaam die u doorgeeft, overeenkomt StartupObject met een type dat is gedefinieerd in de broncode van de huidige compilatie. De compiler zoekt alleen in de bronbestanden die worden gecompileerd, niet in de verwante assembly's, naar het opgegeven type (CS1555). Controleer op typfouten in de volledig gekwalificeerde naam, inclusief de naamruimte.
  • Zorg ervoor dat de identifier die u aan StartupObject doorgeeft, verwijst naar een niet-algemeen class of struct. Voor de compiler is een concreet type vereist dat een geldige Main methode (CS1556) kan bevatten. Interfaces, opsommingen, gedelegeerden en generieke typen kunnen niet worden gebruikt als doelen.
  • Verplaats de opgegeven klasse naar hetzelfde uitvoerbestand als de huidige compilatie. Met de /main optie wordt het toegangspunt binnen één uitvoerassembly vastgesteld en kunnen geen typen worden verwezen die in een andere uitvoer zijn gecompileerd (CS1557).
  • Zorg ervoor dat het opgegeven type is gedefinieerd in de broncode van het huidige project in plaats van in een assembly waarnaar wordt verwezen. De compiler kan geen geïmporteerd type aanwijzen als het toegangspunt (CS1559).
  • Verwijder de optie bij het /main bouwen van een bibliotheek of module. Alleen uitvoerbare projecten (met een OutputType van exe of winexe) hebben toegangspunten (CS2017). Als u een invoerpunt nodig hebt, wijzigt u het uitvoertype in een uitvoerbaar bestand.
  • Zorg ervoor dat het type dat is opgegeven door StartupObject een geldige Main methode declareert. Als het type bestaat maar geen geschikte statische Main methode bevat, genereert de compiler CS1558. Zie de Main sectie methodedeclaratie voor de vereiste handtekening.

Opmerking

CS1557 en CS1559 zijn verouderde diagnostische gegevens die de huidige C#-compiler niet produceert. De scenario's die deze fouten hebben geactiveerd, worden niet meer ondersteund of treden te weinig op om detectie te rechtvaardigen.

Opmerking

CS1555 en CS1556 worden alleen gerapporteerd tijdens build - of herbouwbewerkingen . Ze worden niet weergegeven als IntelliSense-diagnostische gegevens terwijl u in de IDE typt.

Statements op topniveau

  • CS7022: Het toegangspunt van het programma is globale code, waarbij het invoerpunt '{0}' wordt genegeerd.
  • CS8801: Kan geen lokale variabele of lokale functie gebruiken die{0} in deze context is gedeclareerd in een instructie op het hoogste niveau.
  • CS8802: Slechts één compilatie-eenheid kan instructies op het hoogste niveau bevatten.
  • CS8803: Instructies op het hoogste niveau moeten voorafgaan aan naamruimte- en typedeclaraties.
  • CS8805: Programma met behulp van instructies op het hoogste niveau moet een uitvoerbaar bestand zijn.
  • CS8937: Ten minste één instructie op het hoogste niveau mag niet leeg zijn.

Instructies op het hoogste niveau vervangen de expliciete Main methode als ingangspunt van het programma. Zie voor meer informatie instructies op het hoogste niveau in de C# - programmeerhandleiding en de sectie met instructies op het hoogste niveau van de C#-taalspecificatie.

Als u deze fouten wilt corrigeren, moet u ervoor zorgen dat uw gebruik van instructies op het hoogste niveau de volgende regels volgt:

  • Voeg alle instructies op het hoogste niveau samen in één bestand, omdat slechts één compilatie-eenheid (bestand) instructies op het hoogste niveau (CS8802) kan bevatten. Verplaats code op het hoogste niveau van andere bestanden naar dat ene bestand. Herstructureer de resterende bestanden zodat ze alleen naamruimte- en typedeclaraties bevatten.
  • Plaats alle instructies op het hoogste niveau vóór een namespace of type declaraties in het bestand, omdat de compiler vereist dat instructies op het hoogste niveau eerst worden weergegeven (CS8803). Als u using instructies hebt, kunnen deze instructies nog steeds voorafgaan aan de topniveau-instructies.
  • Neem ten minste één instructie op die uitvoerbare code bevat, omdat een bestand met alleen lege instructies, witruimte of opmerkingen niet in aanmerking komt als een geldig toegangspunt (CS8937). Voeg een instructie toe, zoals een methode-aanroep, variabeletoewijzing of expressie om aan de vereiste te voldoen.
  • Alleen binnen de context van de instructie op het hoogste niveau zelf kunt u toegang krijgen tot lokale variabelen en lokale functies die op het hoogste niveau zijn gedeclareerd, omdat deze declaraties beperkt zijn tot de aangemaakte invoerpuntmethode en niet zichtbaar zijn voor andere bestanden of voor typen leden die in hetzelfde bestand zijn gedeclareerd (CS8801). Als u de status tussen bestanden wilt delen, declareert u de variabele als een statisch veld of een eigenschap voor een type.
  • Stel het OutputType van het project in op exe, omdat topniveaustatements een entrypunt definiëren en entrypunten alleen geldig zijn in uitvoerbare projecten (CS8805). Als u een bibliotheek bouwt, verwijdert u de instructies op het hoogste niveau en gebruikt u in plaats daarvan typen en methoden.
  • Verwijder of wijzig de naam van een expliciete Main methode wanneer instructies op het hoogste niveau aanwezig zijn, omdat de compiler de instructies op het hoogste niveau behandelt als het toegangspunt en elke Main methode negeert, waardoor een waarschuwing (CS7022) wordt gegenereerd. Als u een expliciete Main methode wilt gebruiken, verplaatst u de instructiecode op het hoogste niveau naar die methode en verwijdert u de instructies op het hoogste niveau.