Не содержит статического 'основного' метода, подходящего для точки входа

83

Сегодня я начал организовывать свой код в отдельные файлы .cs, и, чтобы позволить методам, которые работают с пользовательским интерфейсом, продолжать работать, я бы создал код .cs под тем же пространством имен и именем общедоступного частичного класса, чтобы методы могли быть совместимым.

Мой заголовок выглядит так в четырех файлах, включая мой основной файл ядра, который вызывает:

public shell()
{
InitializeComponent(); 
}

Область заголовка файлов .cs, которые работают с пользовательским интерфейсом (и, похоже, вызывают этот новый конфликт):

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
    {

Теперь, когда я пытаюсь отладить / просмотреть свое приложение (кстати, это приложение Windows в Visual Studio 2010 Express), я получаю следующее сообщение об ошибке:

Не содержит статического 'основного' метода, подходящего для точки входа

Я просмотрел свойства приложения в объекте Application-> Startup, но он не предлагает мне никаких вариантов. Как я могу сообщить приложению, чтобы оно начало с файла .cs, в котором есть мой InitializeComponent (); команда?

  • Я так долго оглядывался, но не нашел решения.
  • Для свойств каждого файла .cs задано значение «Компилировать».
  • Я не вижу файла App.xaml в моем обозревателе решений, но я вижу файл app.config.

Я все еще новичок, и это моя первая попытка организовать метод с помощью кода C #.

atwellpub
источник
12
у вас есть основной метод ??
bobek 07
Если честно, я нигде в своем коде не вижу метода под названием Main. Я тоже работаю над этим проектом уже пару месяцев.
atwellpub
1
Вам нужен статический метод mainс правильной подписью. Вот как компилятор знает, как запустить вашу программу.
Дэвид Хеффернан,
5
попробуйте добавить что-то подобное в свой проект[STAThread] static void Main(string[] args) { Application.Run(new shell()); }
LB
1
@LB: Создайте это как ответ, чтобы он мог его принять.
Джошуа

Ответы:

129

Я тоже рассматривал эту проблему, и в моем случае решение было слишком простым. Я добавил в решение новый пустой проект. Вновь добавленный проект автоматически устанавливается как консольное приложение. Но поскольку добавленный проект был «пустым», в этом новом проекте не было Program.cs. (Как и ожидалось)

Все, что мне нужно было сделать, это изменить тип вывода свойств проекта на библиотеку классов.

Арне
источник
Думаю, это немного излишний вариант. Было бы намного проще следовать решению @eyossi.
TimWagaman
Но вы хотели консольное приложение или библиотеку классов? Не просто меняйте тип приложения, чтобы исправить ошибку; знать, что вам говорит ошибка. Консольным приложениям требуется точка входа ( static void main()), чтобы определить, где начать выполнение кода; библиотеки классов этого не делают - они вызываются другими библиотеками, которые уже выполняются.
KyleMit
Это излишняя версия того, что предлагает @pixaloop. Прочитав этот ответ, я вспомнил, что при добавлении пустого проекта по умолчанию вывод в консоль. Я просто пошел и поменял его. Хотел опубликовать это как ответ (так как это намного проще), но увидел, что это уже сделал кто-то другой.
EternalWulf 03
Спасибо чувак. Это было бы последнее место, куда я бы смотрел!
eaglei22
Совсем не перебор. Это была именно та проблема в моей ситуации. Компилятор искал mainв двух моих других проектах консольное приложение, такое же, как проект StartUp. Изменение этих двух «вспомогательных» проектов на « Библиотеку классов» на экране «Свойства» немедленно исправило проблему.
Ctrl S
81

Измените Тип вывода в разделе «Проект»> «Свойства» на «Библиотеку классов». По умолчанию для этого параметра могло быть установлено «Консольное приложение».

Автоматизация протестирована
источник
1
Это именно то, что я сделал, отлично работает. Если вы добавили «Пустой» проект, по умолчанию используется консоль.
EternalWulf 03
21

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

[STAThread]
static void Main()
{
}
Eyossi
источник
13

У меня была эта ошибка, и я решил ее с помощью этого решения.

  1. Щелкните правой кнопкой мыши проект
  2. Выберите "Свойства"
  3. Установите "Тип вывода" на "Библиотека классов".
Али Ахмади
источник
да, но вам нужен другой проект для отладки библиотеки классов. Поражение цели
Fandango68
Сработало для меня, потому что я получал эту ошибку только в служебном проекте, а не в проекте запуска
Джошуа Суэйн
11

Если у вас нет файла с именем Program.cs, просто добавьте новый класс и назовите его Program.cs.

Затем вставьте этот код:

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

 }
ПЗУ
источник
9
  1. Выберите App.xaml и отобразите его свойства. Установите для действия сборки значение ApplicationDefinition .
  2. App.xaml и соответствующий ему файл * .cs должны быть помещены в корневой каталог файла * .csproj, то есть не в папку «Исходный код».
Роман Волков
источник
1
Это случай для меня. Я ctrl + c скопировал App.xml в проект, и действие сборки было установлено на «Страница».
Джеки Ченг
7

Если у вас есть метод Main, но по-прежнему возникает эта ошибка, убедитесь, что для файла, содержащего метод Main, для параметра «Действие сборки» установлено значение «Скомпилировать», а для параметра «Копировать в выходной каталог» установлено значение «Не копировать».

Simonbs
источник
Спасибо! Возможно, через пару часов я пойму, что не могу сгенерировать синтаксическую ошибку, и поэтому посмотрю туда ..
Джерард Онилл
6

Отредактируйте файл .csproj

<OutputType>Library</OutputType>

ура!

Bereket Gebredingle
источник
1
Это действительно работает, но это должно быть Library(с большой буквы L)
расстроено
Предполагается, что это значение по умолчанию в .net core docs.microsoft.com/fr-fr/visualstudio/msbuild/… Оказывается, когда ваш проект <Project Sdk = "Microsoft.NET.Sdk.Web"> значение по умолчанию Во время сборки библиотека заменяется на Exe. Разрешение SDK 'Microsoft.NET.Sdk.Web.ProjectSystem' ... Переназначение свойства: $ (OutputType) = "Exe" (предыдущее значение: "Library")
Romain Hautefeuille
Вместо редактирования .csproj вы можете использовать графический интерфейс в Visual Studio 2019. 1. Выберите проект в обозревателе решений 2. Нажмите «Проект» -> «Свойства <project_name>» на главной панели инструментов 3. Тип вывода: Класс Библиотека 4. Сохранить
Джошуа Суэйн
5

Для меня ошибка на самом деле была вызвана тем, что «функция 'async main' недоступна в C # 7.0. Используйте версию языка 7.1 или выше». Эта проблема приводила к появлению сообщения «Не содержит статического« основного »метода, подходящего для точки входа» в списке ошибок, но в окне вывода отображалась ошибка «недоступно». Чтобы исправить это, я изменил языковую версию с «Последняя дополнительная версия C # (по умолчанию)» на «Последняя дополнительная версия C # (последняя)» в разделе «Дополнительные параметры сборки».

Лунная собака 2112
источник
Хороший улов. Фактическая проблема с версией указана только в окне вывода
int-i
4

эй, у меня такая же ошибка, и решение этой ошибки - просто написать заглавную M вместо маленького m .. например: - static void Main () Я надеюсь, что это поможет ..

Четан Сони
источник
3

Была ли эта проблема в VS 2017, вызванная:

статический асинхронная задача Main (строка [] аргументы)

( Функция async main недоступна в C # 7.0. Используйте версию 7.1 или выше )

Добавление

<LangVersion>latest</LangVersion>

app.csproj помогло.

Том
источник
Думаю, у меня было то же самое, потому что я изначально создал решение с VS2019, а затем попытался открыть его в VS2017. Mine - консольное приложение dotnetcore.
trebor
2

Похоже, что проект Windows Forms пытается использовать стартовую форму, но по какой-то причине свойства проекта настроены на запуск как Main.

Если вы включили платформу приложения, возможно, вы не увидите, что Main активен (это недопустимая конфигурация).

Джошуа
источник
Мне было бы интересно услышать немного больше о настройке Application Framework и обо всем, что может указывать программному обеспечению искать Main (), когда метод Main нигде не существует.
atwellpub 07
Я считаю, что настройка Application Framework применима только к VB.NET. Приложения C # Forms всегда имеют "main" в качестве точки входа.
А. Уилсон,
2

Салам, у меня есть и то, Visual Studio 2017и другоеVisual Studio 2019

Visual Studio 2019 не показывает эту ошибку, но 2017 показывает. Попробуйте установить Visual Studio 2019.


Visual Studio 2017

Visual Studio 2017


Visual Studio 2019

Visual Studio 2019

Али Джамал
источник
1

Если вы хотите разрешить указывать параметры в команде, они должны выглядеть так:

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

вы не можете указать более одного параметра, иначе это также вызовет ошибку, указанную выше.

Джерри Преториус
источник
1

Для некоторых, приезжающих сюда:

В моем случае я скопировал .csproj из демонстрационного проекта, который был включен <EnableDefaultCompileItems>false</EnableDefaultCompileItems>без включения файла Program.cs. Исправление заключалось в том, чтобы либо удалить EnableDefaultCompileItems, либо явно включить Program.cs в компиляцию.

Мэдисон Хейни
источник
1

hellow, ваш основной класс был удален, поэтому добавьте новый класс, имя которого установлено как Main.cs, и уничтожьте этот код или, если проблема в окне, такая же проблема на этом

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");

            }
        }
}
Яш Патель
источник
h'whoops, случайно вытащил мой главный файл из проекта iOS. Спасибо
Дэн Болье
1

Если вы используете проект библиотеки классов, установите «Библиотека классов» в качестве типа вывода в свойствах в разделе приложения проекта.

Манвир Сингх
источник
1

После размещения вышеуказанного кода в Program.cs выполните следующие действия:

  1. Щелкните правой кнопкой мыши проект

  2. Выберите "Свойства"

  3. Установите "Тип вывода" на "Приложение Windows"

  4. Объект запуска: namepace.Program

Сиддхи Дилип Камат
источник
0

Я тоже столкнулся с этой проблемой. Затем я понял, что выбираю консольное приложение (пакет), а не консольное приложение.

Субрахманья Прасад
источник
0

Я использую Visual Studio, и у меня тоже была эта проблема. Это заняло у меня некоторое время, но в моей программе это было вызвано тем, что я случайно удалил класс с именем «Программа», который создается автоматически.

MaChaToc
источник
0

Для будущих читателей, которые столкнулись с той же проблемой с приложением Windows Forms, одним из решений является добавление этих строк в ваш основной / стартовый класс формы:

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

Затем перейдите в свойства проекта> Приложение> раскрывающийся список Startup Object, вы должны увидеть пространство имен MyMainForm, выбрать его, очистить и построить решение. И это должно работать.

сердитый
источник
0

Проверьте, установлен ли проект как «Начальный проект».

Щелкните правой кнопкой мыши проект и выберите в меню «Установить как запускаемый проект».

Джеймс Вежба
источник
0

Если вы похожи на меня, то вы могли начать с библиотеки классов, а затем переключили ее на консольное приложение. Если да, измените это ...

namespace ClassLibrary1
{
    public class Class1
    {
    }
}

К этому...

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}
Адам Кокс
источник
0

Допустимая запись выглядит так:

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

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

Моя точка входа была помещена в /App_Code/Main.cs, и мне пришлось сделать следующее:

  1. Установите проект -> Свойства -> Приложение -> Тип вывода = Консольное приложение
  2. Создайте /App_Code/Main.cs
  3. Добавьте в него приведенный выше код (и укажите методы в моем проекте)
  4. Щелкните правой кнопкой мыши файл Main.cs -> Свойства -> Действие сборки = Скомпилировать

После этого я могу установить вывод (как упоминалось в шаге 1) в Библиотеку классов, чтобы запустить веб-сайт, или Консольное приложение, чтобы войти в режим консоли.

Почему я сделал это вместо двух отдельных проектов?

Просто потому, что у меня были ссылки на Entity Framework и другие конкретные ссылки, которые создавали проблемы с запуском двух отдельных проектов.

Для более простых решений я бы по-прежнему рекомендовал два отдельных проекта, так как вывод консоли - это в основном тестовый код, и вы, вероятно, не хотите рисковать, выходя из рабочего кода.

Питер Киндберг
источник
-1

Возможно, непреднамеренно, но перемещение моего файла докеров в папку решения вместо проекта устранило ошибку. Это было полезно, когда я все еще хотел запустить решение независимо от докера.

Риривас
источник