Не містить статичного основного методу, придатного для точки входу


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 object, але він не пропонує мені жодних опцій. Як я можу повідомити програму про початок із файлу .cs, що містить мій InitializeComponent (); команда?

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

Я все ще дуже новий, і це моя перша спроба організувати метод з кодом c #.


12
у вас є основний метод ??
bobek

Чесно кажучи, я ніде в своєму коді не бачу методу під назвою 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. Прочитавши цю відповідь, я згадав, що при додаванні проекту Empty за замовчуванням виводиться на Console. Тож я просто пішов і змінив його. Хотів опублікувати це як відповідь (оскільки це набагато простіше), але побачив, що хтось уже це зробив.
EternalWulf

Спасибі людино. Це було б останнє місце, куди б я подивився!
eaglei22

Зовсім не надмірно. Це було саме питання в моїй ситуації. Компілятор шукав mainу моїх двох інших проектах, які були консольними додатками , як і проект StartUp. Зміна цих двох «допоміжних» проектів на « Бібліотеку класів» на їх екрані «Властивості» це негайно виправлено.
Ctrl S

81

Змініть тип виводу в розділі «Проект> Властивості» на «Бібліотеку класів». За замовчуванням це налаштування могло бути встановлено як «Консольне додаток».


1
Це саме те, що я зробив, працює ідеально. Якщо ви додали проект "Порожній", він за замовчуванням використовується для консолі.
EternalWulf

21

Спробуйте додати цей метод до класу і перевірте, чи все-таки ви отримуєте помилку:

[STAThread]
static void Main()
{
}

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, "Дія побудови" має значення "Компілювати", а "Копіювати у вихідний каталог" - "Не копіювати".


Дякую! Можливо, ще через пару годин я зрозумів би, що не зміг генерувати синтаксичну помилку, і таким чином подивився туди ..
Джерард О.Н.,

6

Відредагуйте файл .csproj

<OutputType>Library</OutputType>

ура!


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" (попереднє значення: "Бібліотека")
Ромен Отенфель

Замість редагування .csproj ви можете використовувати графічний інтерфейс у Visual Studio 2019. 1. Виберіть проект у Провіднику рішень 2. Натисніть "Проект" -> "<ім'я_проекту> Властивості" на головній панелі інструментів. 3. Тип виводу: Клас Бібліотека 4. Збережи
Джошуа Суейн

5

Для мене помилка насправді була створена "Функція" async main "недоступна в C # 7.0. Будь ласка, використовуйте мовну версію 7.1 або новішу". Ця проблема призвела до повідомлення "Не містить статичного методу" main ", придатного для точки входу" у списку помилок, але у вікні "Вивід" з'явилася помилка "недоступна". Щоб виправити це, я змінив мовну версію з "остання незначна версія C # (за замовчуванням)" на "остання незначна версія C # (остання)" у розділі "Розширені налаштування збірки".


Хороший улов. Фактична проблема версії вказана лише у вікні виводу
int-i

4

привіт я отримав ту саму помилку, і рішення цієї помилки просто написати велику букву М замість малого m .. наприклад: - static void Main () Я сподіваюся, це допоможе ..


3

Виникла ця проблема у VS 2017 через:

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

( Функція "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

Я вважаю, що налаштування 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

за допомогою вашого основного класу було видалено, тому додайте новий клас, ім'я якого встановлено як Main.cs, і визначте цей код, або якщо porblem у вікні, така сама проблема з цим

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. Об’єкт запуску: простір імен. Програма




0

Я використовую Visual Studio і також мав цю проблему. Це зайняло у мене деякий час, але в моїй програмі це було спричинено тим, що я випадково видалив клас із назвою "Програма", який створюється автоматично.


0

Для майбутніх читачів, які зіткнулися з тією ж проблемою з Windows Forms Application, одним із рішень є додавання цих рядків до основного класу / форми запуску:

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

Потім перейдіть до властивостей проекту> Застосування> Запуск об'єкта запуску, повинен побачити простір імен. 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) на Бібліотеку класів для запуску веб-сайту або Консольну програму для переходу в режим консолі.

Чому я зробив це замість 2 окремих проектів?

Просто тому, що я мав посилання на Entity Framework та інші конкретні посилання, які створювали проблеми із запуском 2 окремих проектів.

Для більш простих рішень я все-таки рекомендую 2 окремі проекти, оскільки вихід консолі - це в основному тестовий код, і ви, мабуть, не хочете ризикувати, що вийде у виробничому коді.


-1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.