Поделиться через


Устранение ошибок и предупреждений, связанных с точкой входа программы

В этой статье рассматриваются следующие ошибки и предупреждения компилятора:

  • CS0017. Имя выходного файла программы имеет несколько точек входа. Скомпилируйте с помощью /main, чтобы указать тип, содержащий точку входа.
  • CS0028: «объявление функции» имеет неправильную сигнатуру для точки входа
  • CS0402: "идентификатор": точка входа не может быть универсальной или в универсальном типе
  • CS1555: не удалось найти класс, указанный для метода Main
  • CS1556: "конструктор", указанный для метода Main, должен быть допустимым классом или структурой
  • CS1557: не удается использовать класс для метода Main, так как он находится в другом выходном файле
  • CS1558: "class" не имеет подходящего статического метода Main
  • CS1559: не удается использовать "object" для метода Main, так как он импортирован
  • CS2017: не удается указать /main при создании модуля или библиотеки
  • CS5001: программа не содержит статический метод Main, подходящий для точки входа.
  • CS7022: точка входа программы — это глобальный код, игнорирующий точку входа '{0}' .
  • CS8801: не удается использовать локальную переменную или локальную функцию"{0}, объявленную в инструкции верхнего уровня в этом контексте.
  • CS8802: Только один компиляционный модуль может иметь операторы верхнего уровня.
  • CS8803: Выражения верхнего уровня должны предшествовать объявлениям пространства имен и типов.
  • CS8805: программа с использованием инструкций верхнего уровня должна быть исполняемым файлом.
  • CS8899: точки входа приложений не могут быть атрибутом UnmanagedCallersOnly.
  • CS8937: по крайней мере одна инструкция верхнего уровня должна быть непустой.

Main Объявление метода

  • CS0017. Имя выходного файла программы имеет несколько точек входа. Скомпилируйте с помощью /main, чтобы указать тип, содержащий точку входа.
  • CS0028: объявление функции имеет неправильную сигнатуру для точки входа
  • CS0402: "идентификатор": точка входа не может быть универсальной или в универсальном типе
  • CS1558: "class" не имеет подходящего статического метода Main
  • CS5001: программа не содержит статический метод Main, подходящий для точки входа.
  • CS8899: точки входа приложений не могут быть атрибутом UnmanagedCallersOnly.

Программа, компилируемая в исполняемый файл, должна содержать допустимый Main метод в качестве точки входа. Дополнительные сведения см. в статьях Main() и аргументов командной строки.

Чтобы исправить эти ошибки, убедитесь, что Main объявление метода следует следующим правилам:

  • Объявите Main метод как static с типом возвращаемого значения void, int или Task, так как среда выполнения Task<int> требует определенной подписи для идентификации точки входа программы (CS0028, CS1558). Метод может при необходимости принимать string[] параметр для аргументов командной строки. Если используется async модификатор, тип возвращаемого значения должен быть Task или Task<int>, и необходимо использовать язык C# версии 7.1 или более поздней.
  • Переместите Main метод из любого обобщённого типа, так как среда выполнения не может определить уникальную точку входа, если для содержащего типа требуются аргументы типа (CS0402).
  • Удалите атрибут UnmanagedCallersOnlyAttribute из метода Main, потому что точки входа должны вызываться из управляемого кода, а UnmanagedCallersOnly ограничивает вызов метода только неуправляемыми вызывающими (CS8899).
  • Если код содержит несколько Main методов в разных типах, используйте параметр компилятора StartupObject , чтобы указать, какой тип содержит предназначенную точку входа (CS0017). Без этого параметра компилятор не может определить, какой Main метод следует использовать.
  • Убедитесь, что исполняемый проект определяет Main метод с правильной подписью, так как для проекта с outputTypeexe или winexe требуется точка входа (CS5001, CS1558). Имя метода чувствительно к регистру - main не подходит. Если исполняемый файл не нужен, измените тип вывода на библиотеку.

Замечание

CS0028 — это устаревшая диагностика, которую текущий компилятор C# не выдает. Современные версии компилятора сообщают CS1558 или CS5001, если метод Main имеет недопустимую сигнатуру.

Замечание

CS0017, CS0028, CS0402, CS1558 и CS5001 сообщаются только во время операций сборки или перестроения . Они не отображаются как диагностические предупреждения IntelliSense во время набора текста в интегрированной среде разработки.

Параметр компилятора StartupObject

  • CS1555: не удалось найти класс, указанный для метода Main
  • CS1556: "конструктор", указанный для метода Main, должен быть допустимым классом или структурой
  • CS1557: не удается использовать класс для метода Main, так как он находится в другом выходном файле
  • CS1559: не удается использовать "object" для метода Main, так как он импортирован
  • CS2017: не удается указать /main при создании модуля или библиотеки

Параметр компилятора StartupObject (также известный как /main) указывает, какой тип содержит метод программы Main при определении нескольких типов. Дополнительные сведения см. в статьях StartupObject и Main() и аргументов командной строки.

Чтобы исправить эти ошибки, убедитесь, что StartupObject параметр ссылается на допустимый тип:

  • Убедитесь, что полное имя класса, которое вы передаете в StartupObject, соответствует типу, определенному в исходном коде текущей компиляции. Компилятор выполняет поиск только в исходных файлах, которые компилируются, а не в сборках, на которые ссылаются, для указанного типа (CS1555). Проверьте опечатки в полном имени, включая пространство имен.
  • Убедитесь, что идентификатор, который вы передаете в StartupObject, относится к неготовому class или struct. Компилятору требуется конкретный тип, который может содержать допустимый Main метод (CS1556). Интерфейсы, перечисления, делегаты и универсальные типы не являются допустимыми целевыми объектами.
  • Переместите указанный класс в тот же выходной файл, что и текущая компиляция. Параметр /main определяет точку входа в одной итоговой сборке и не может ссылаться на типы, содержащиеся в другой сборке (CS1557).
  • Убедитесь, что указанный тип определен в исходном коде текущего проекта, а не в указанной сборке. Компилятор не может назначить импортированный тип как точку входа (CS1559).
  • /main Удалите параметр при создании библиотеки или модуля. Только исполняемые проекты (с OutputTypeexe или winexe) имеют точки входа (CS2017). Если вам нужна точка входа, измените тип выходных данных на исполняемый файл.
  • Убедитесь, что тип, указанный в StartupObject, объявляет допустимый метод Main. Если тип существует, но не содержит подходящий статический Main метод, компилятор создает CS1558. См. Main раздел объявления метода для требуемой сигнатуры.

Замечание

CS1557 и CS1559 — это устаревшие диагностические сообщения, которые не генерируются текущим компилятором C#. Сценарии, которые вызвали эти ошибки, больше не поддерживаются или происходят слишком редко, чтобы гарантировать обнаружение.

Замечание

CS1555 и CS1556 сообщаются только во время операций сборки или перестроения. Они не отображаются как диагностика IntelliSense во время ввода в интегрированной среде разработки.

Инструкции верхнего уровня

  • CS7022: точка входа программы — это глобальный код, игнорирующий точку входа '{0}' .
  • CS8801: не удается использовать локальную переменную или локальную функцию"{0}, объявленную в инструкции верхнего уровня в этом контексте.
  • CS8802: только один компиляционный блок может содержать операторы верхнего уровня.
  • CS8803: инструкции верхнего уровня должны предшествовать объявлениям пространства имен и типов.
  • CS8805: программа с использованием инструкций верхнего уровня должна быть исполняемым файлом.
  • CS8937: по крайней мере одна инструкция верхнего уровня должна быть непустой.

Операторы верхнего уровня заменяют явный Main метод точкой входа программы. Дополнительные сведения см. в инструкциях верхнего уровня в руководстве по программированию на C# и спецификации функций инструкций верхнего уровня .

Чтобы исправить эти ошибки, убедитесь, что вы используете инструкции верхнего уровня, следуя этим правилам:

  • Консолидируйте все операторы верхнего уровня в один файл, так как только одна единица компиляции (файл) может содержать инструкции верхнего уровня (CS8802). Переместите любой код верхнего уровня из других файлов в один файл. Переструктурируйте оставшиеся файлы так, чтобы они содержали только пространства имен и объявления типов.
  • Поместите все инструкции верхнего уровня перед любым namespace или type объявлением в файле, так как компилятору требуется, чтобы операторы верхнего уровня отображались в первую очередь (CS8803). Если у вас есть using директивы, эти директивы по-прежнему могут предшествовать операторам верхнего уровня.
  • Включите по крайней мере одну инструкцию, содержащую исполняемый код, так как файл с пустыми операторами, пробелами или комментариями не соответствует допустимой точке входа (CS8937). Добавьте инструкцию, например вызов метода, назначение переменной или выражение для удовлетворения требования.
  • Доступ к локальным переменным и локальным функциям, объявленным в операторах верхнего уровня, возможен только из контекста самих операторов верхнего уровня, так как эти объявления связаны с созданным методом точки входа и не видны для других файлов или для членов типов, объявленных в том же файле (CS8801). Если необходимо предоставить общий доступ к состоянию между файлами, объявите переменную как статическое поле или свойство для типа.
  • Задайте для объекта OutputType значение exe, так как операторы верхнего уровня определяют точку входа и точки входа допустимы только в исполняемых проектах (CS8805). Если вы создаете библиотеку, удалите инструкции верхнего уровня и используйте типы и методы.
  • Удалите или переименуйте любой явный Main метод при наличии инструкций верхнего уровня, так как компилятор обрабатывает операторы верхнего уровня как точку входа и игнорирует любой Main метод, создавая предупреждение (CS7022). Если вы планируете использовать явный Main метод, переместите код инструкций верхнего уровня в этот метод и удалите инструкции верхнего уровня.