Udostępnij za pośrednictwem


Usuwanie błędów i ostrzeżeń związanych z punktem wejścia programu

W tym artykule opisano następujące błędy i ostrzeżenia kompilatora:

  • CS0017: Program "nazwa pliku wyjściowego" ma zdefiniowany więcej niż jeden punkt wejścia. Skompiluj z /main, aby określić typ, który zawiera punkt wejścia.
  • CS0028: "deklaracja funkcji" ma niewłaściwy podpis jako punkt wejścia
  • CS0402: "identyfikator": punkt wejścia nie może być ogólny lub w typie ogólnym
  • CS1555: Nie można odnaleźć klasy określonej dla metody Main
  • CS1556: "konstrukcja" określona dla metody Main musi być prawidłową klasą lub strukturą
  • CS1557: Nie można użyć klasy dla metody Main, ponieważ znajduje się w innym pliku wyjściowym
  • CS1558: "klasa" nie ma odpowiedniej statycznej metody Main
  • CS1559: Nie można użyć obiektu "object" dla metody Main, ponieważ jest importowany
  • CS2017: Nie można określić /main, jeśli kompilujesz moduł lub bibliotekę
  • CS5001: Program nie zawiera statycznej metody "Main" odpowiedniej dla punktu wejścia
  • CS7022: Punkt wejścia programu jest kodem globalnym, ignorując punkt wejścia "{0}".
  • CS8801: Nie można użyć zmiennej lokalnej ani funkcji lokalnej "{0}" zadeklarowanej w instrukcji najwyższego poziomu w tym kontekście.
  • CS8802: Tylko jedna jednostka kompilacji może zawierać instrukcje najwyższego poziomu.
  • CS8803: Instrukcje najwyższego poziomu muszą poprzedzać przestrzeń nazw i deklaracje typów.
  • CS8805: Program używający instrukcji najwyższego poziomu musi być plikiem wykonywalnym.
  • CS8899: Punkty wejścia aplikacji nie mogą być przypisywane "UnmanagedCallersOnly".
  • CS8937: Co najmniej jedna instrukcja najwyższego poziomu musi być niepusta.

Main deklaracja metody

  • CS0017: Program "nazwa pliku wyjściowego" ma zdefiniowany więcej niż jeden punkt wejścia. Skompiluj z /main, aby określić typ, który zawiera punkt wejścia.
  • CS0028: "deklaracja funkcji" ma niewłaściwy podpis jako punkt wejścia
  • CS0402: "identyfikator": punkt wejścia nie może być ogólny lub w typie ogólnym
  • CS1558: "klasa" nie ma odpowiedniej statycznej metody Main
  • CS5001: Program nie zawiera statycznej metody "Main" odpowiedniej dla punktu wejścia
  • CS8899: Punkty wejścia aplikacji nie mogą być przypisywane "UnmanagedCallersOnly".

Program kompilujący do pliku wykonywalnego musi zawierać prawidłową Main metodę jako punkt wejścia. Aby uzyskać więcej informacji, zobacz Main() i argumenty wiersza polecenia.

Aby naprawić te błędy, upewnij się, że Main deklaracja metody jest zgodna z następującymi regułami:

  • Zadeklaruj metodę Main jako static, przy zwracanym typie void, int, Task lub Task<int>, ponieważ środowisko uruchomieniowe wymaga szczególnego podpisu do identyfikacji punktu wejścia programu (CS0028, CS1558). Metoda może opcjonalnie zaakceptować string[] parametr argumentów wiersza polecenia. Jeśli używasz modyfikatora async, typ zwracany musi być Task lub Task<int>, a docelowa wersja języka C# to 7.1 lub nowsza.
  • Przenieś metodę Main z dowolnego typu ogólnego, ponieważ środowisko uruchomieniowe nie może rozpoznać unikatowego punktu wejścia, gdy typ zawierający wymaga argumentów typu (CS0402).
  • UnmanagedCallersOnlyAttribute Usuń atrybut z metody, ponieważ punkty wejścia muszą być wywoływane z kodu zarządzanego Main i UnmanagedCallersOnly ogranicza metodę tylko do niezarządzanych wywołań (CS8899).
  • Jeśli kod zawiera wiele Main metod w różnych typach, użyj opcji kompilatora StartupObject , aby określić, który typ zawiera zamierzony punkt wejścia (CS0017). Bez tej opcji kompilator nie może określić, która Main metoda ma być używana.
  • Sprawdź, czy projekt wykonywalny definiuje metodę Main z poprawnym podpisem, ponieważ projekt z OutputTypeexe lub winexe wymaga punktu wejścia (CS5001, CS1558). Nazwa metody jest rozróżniana według wielkości liter — main nie spełnia wymagań. Jeśli nie potrzebujesz pliku wykonywalnego, zmień typ danych wyjściowych na bibliotekę.

Uwaga / Notatka

CS0028 to starsza diagnostyka, która nie jest generowana przez obecny kompilator C#. Nowoczesne wersje kompilatora raportują CS1558 lub CS5001 zamiast tego, gdy metoda Main ma nieprawidłowy podpis.

Uwaga / Notatka

CS0017, CS0028, CS0402, CS1558 i CS5001 są zgłaszane tylko podczas operacji kompilacji lub odbudowywania . Nie są wyświetlane jako diagnostyka IntelliSense podczas pisania w IDE.

StartupObject Opcja kompilatora

  • CS1555: Nie można odnaleźć klasy określonej dla metody Main
  • CS1556: "konstrukcja" określona dla metody Main musi być prawidłową klasą lub strukturą
  • CS1557: Nie można użyć klasy dla metody Main, ponieważ znajduje się w innym pliku wyjściowym
  • CS1559: Nie można użyć obiektu "object" dla metody Main, ponieważ jest importowany
  • CS2017: Nie można określić /main, podczas kompilowania modułu lub biblioteki

Opcja kompilatora StartupObject (znana również jako /main) określa, który typ zawiera metodę programu Main , gdy zdefiniowano jeden z wielu typów. Aby uzyskać więcej informacji, zobacz StartupObject i Main() oraz argumenty wiersza polecenia.

Aby naprawić te błędy, upewnij się, że StartupObject opcja odwołuje się do prawidłowego typu:

  • Sprawdź, czy przekazana w pełni kwalifikowana nazwa StartupObject klasy jest zgodna z typem zdefiniowanym w kodzie źródłowym bieżącej kompilacji. Kompilator przeszukuje tylko pliki źródłowe, które są kompilowane – nie zestawy odwołań – dla określonego typu (CS1555). Sprawdź pisownię w pełnej nazwie kwalifikowanej, w tym przestrzeni nazw.
  • Upewnij się, że przekazany identyfikator StartupObject odwołuje się do elementu innego niż ogólny class lub struct. Kompilator wymaga konkretnego typu, który może zawierać prawidłową Main metodę (CS1556). Interfejsy, wyliczenia, delegaty i typy ogólne nie są prawidłowymi obiektami docelowymi.
  • Przenieś określoną klasę do tego samego pliku wyjściowego co bieżąca kompilacja. Opcja /main rozwiązuje punkt wejścia w ramach pojedynczego zestawu wyjściowego i nie może odwoływać się do typów skompilowanych do innych danych wyjściowych (CS1557).
  • Upewnij się, że określony typ jest zdefiniowany w kodzie źródłowym bieżącego projektu, a nie w przywoływanym zestawie. Kompilator nie może wyznaczyć zaimportowanego typu jako punktu wejścia (CS1559).
  • /main Usuń opcję podczas kompilowania biblioteki lub modułu. Tylko projekty wykonywalne (z parametrem OutputTypeexe lub winexe) mają punkty wejścia (CS2017). Jeśli potrzebujesz punktu wejścia, zmień typ danych wyjściowych na plik wykonywalny.
  • Upewnij się, że typ określony przez StartupObject deklaruje prawidłową Main metodę. Jeśli typ istnieje, ale nie zawiera odpowiedniej metody statycznej Main , kompilator generuje CS1558. Zobacz sekcję Main deklaracji metody dla wymaganego podpisu.

Uwaga / Notatka

CS1557 i CS1559 to starsza diagnostyka, które nie są generowane przez bieżący kompilator języka C#. Scenariusze, które wyzwoliły te błędy, nie są już obsługiwane lub występują zbyt często, aby uzasadnić wykrywanie.

Uwaga / Notatka

Cs1555 i CS1556 są zgłaszane tylko podczas operacji kompilacji lub odbudowywania . Nie są wyświetlane jako diagnostyka IntelliSense podczas pisania w IDE.

Wyrażenia najwyższego poziomu

  • CS7022: Punkt wejścia programu jest kodem globalnym, ignorując punkt wejścia "{0}".
  • CS8801: Nie można użyć zmiennej lokalnej ani funkcji lokalnej "{0}" zadeklarowanej w instrukcji najwyższego poziomu w tym kontekście.
  • CS8802: Tylko jedna jednostka kompilacji może zawierać instrukcje najwyższego poziomu.
  • CS8803: Instrukcje najwyższego poziomu muszą poprzedzać przestrzeń nazw i deklaracje typów.
  • CS8805: Program używający instrukcji najwyższego poziomu musi być plikiem wykonywalnym.
  • CS8937: Co najmniej jedna instrukcja najwyższego poziomu musi być niepusta.

Instrukcje najwyższego poziomu zastępują jawną Main metodę jako punkt wejścia programu. Aby uzyskać więcej informacji, zobacz Instrukcje najwyższego poziomu w przewodniku programowania w języku C# i specyfikacji funkcji instrukcji najwyższego poziomu .

Aby naprawić te błędy, upewnij się, że użycie instrukcji najwyższego poziomu jest zgodne z następującymi regułami:

  • Skonsoliduj wszystkie instrukcje najwyższego poziomu w jednym pliku, ponieważ tylko jedna jednostka kompilacji (plik) może zawierać instrukcje najwyższego poziomu (CS8802). Przenieś dowolny kod najwyższego poziomu z innych plików do tego pojedynczego pliku. Zmień strukturę pozostałych plików, tak aby zawierały tylko przestrzeń nazw i deklaracje typów.
  • Umieść wszystkie instrukcje najwyższego poziomu przed dowolnymi namespace deklaracjami lub type w pliku, ponieważ kompilator wymaga, aby instrukcje najwyższego poziomu pojawiały się jako pierwsze (CS8803). Jeśli masz dyrektywy using, te dyrektywy nadal mogą poprzedzać instrukcje najwyższego poziomu.
  • Dołącz co najmniej jedną instrukcję zawierającą kod wykonywalny, ponieważ plik zawierający tylko puste instrukcje, białe znaki lub komentarze nie kwalifikują się jako prawidłowy punkt wejścia (CS8937). Dodaj instrukcję, taką jak wywołanie metody, przypisanie zmiennej lub wyrażenie, aby spełnić wymaganie.
  • Dostęp do zmiennych lokalnych i funkcji lokalnych zadeklarowanych w instrukcjach najwyższego poziomu tylko z poziomu samego kontekstu instrukcji najwyższego poziomu, ponieważ te deklaracje są ograniczone do metody wygenerowanego punktu wejścia i nie są widoczne dla innych plików ani elementów członkowskich typu zadeklarowanych w tym samym pliku (CS8801). Jeśli chcesz udostępnić stan między plikami, zadeklaruj zmienną jako pole statyczne lub właściwość w typie.
  • Ustaw parametr OutputType projektu na exe, ponieważ instrukcje najwyższego poziomu definiują punkt wejścia i punkty wejścia są prawidłowe tylko w projektach wykonywalnych (CS8805). Jeśli tworzysz bibliotekę, usuń instrukcje najwyższego poziomu i zamiast tego użyj typów i metod.
  • Usuń lub zmień nazwę dowolnej jawnej Main metody, gdy są obecne instrukcje najwyższego poziomu, ponieważ kompilator traktuje instrukcje najwyższego poziomu jako punkt wejścia i ignoruje dowolną Main metodę, generując ostrzeżenie (CS7022). Jeśli zamierzasz użyć metody jawnej Main , przenieś kod instrukcji najwyższego poziomu do tej metody i usuń instrukcje najwyższego poziomu.