Нет Main () в WPF? - PullRequest
       44

Нет Main () в WPF?

110 голосов
/ 23 апреля 2010

Я новичок в программировании, но я был уверен, что одним из универсальных правил было то, что программа запускается с Main (). Я не вижу ни одного, когда я создаю проект WPF. Main () просто называет что-то по-другому в WPF?

Ответы [ 7 ]

109 голосов
/ 12 ноября 2014

Метод Main () создается автоматически. Если вы хотите предоставить свой собственный, вы должны (проверено в VS2013 и VS2017):

  • Щелкните правой кнопкой мыши App.xaml в обозревателе решений, выберите Свойства
  • Измените «Build Action» на «Page» (начальное значение «ApplicationDefinition»)

Затем просто добавьте метод Main () в App.xaml.cs. Это может быть так:

[STAThread]
public static void Main()
{
    var application = new App();
    application.InitializeComponent();
    application.Run();
}
70 голосов
/ 23 апреля 2010

Он генерируется во время сборки, но вы можете предоставить свой собственный (устранение неоднозначности в свойствах проекта при необходимости). Найдите в файле obj / debug файл приложения; У меня есть (любезно предоставлено "C # 2010 Express") App.g.i.cs с:

namespace WpfApplication1 {


    /// <summary>
    /// App
    /// </summary>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
    public partial class App : System.Windows.Application {

        /// <summary>
        /// InitializeComponent
        /// </summary>
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        public void InitializeComponent() {

            #line 4 "..\..\..\App.xaml"
            this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative);

            #line default
            #line hidden
        }

        /// <summary>
        /// Application Entry Point.
        /// </summary>
        [System.STAThreadAttribute()]
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        public static void Main() {
            WpfApplication1.App app = new WpfApplication1.App();
            app.InitializeComponent();
            app.Run();
        }
    }
}
13 голосов
/ 23 апреля 2010

Main() автоматически предоставляется CLR и WPF.

Компилятор C # принимает параметр командной строки /m, который указывает тип, содержащий реализацию Main(). По соглашению, если объект запуска не указан явно, CLR будет искать любой класс, имеющий статический метод Main(), и будет вызывать его. (Как отметил @Marc Gravel в своем комментарии)

В случае WPF Main() генерируется автоматически при сборке App.xaml и указывается ключ / m, чтобы компилятор C # использовал этот класс в качестве точки входа. Однако, если вы посмотрите на свойства проекта, то обнаружите, что вы можете выбрать объект запуска. Поэтому, если вы хотите, вы можете предоставить свой собственный класс, который реализует Main().

Обратите внимание, что это возложит на вас ответственность за создание экземпляра Application и вызовет его метод Run(), чтобы убедиться, что инфраструктура WPF запущена правильно.

6 голосов
/ 23 апреля 2010

main() - это стандартная точка входа для приложения, но все приложения структурированы таким образом.В проекте XAML в файле App.XAML указывается точка входа, где указывается StartupUri="MainWindow.xaml".

. Как утверждают другие, фактическая основная функция генерируется на основе содержимого файлов XAML впроект.

6 голосов
/ 23 апреля 2010

Main() генерируется во время компиляции. Вы можете найти его в App.g.cs (в папке obj/{Debug,Release}).

0 голосов
/ 17 сентября 2018

Если вы удалили по умолчанию App.xaml и MinWindow.xaml, лучше отредактировать .csproj После добавления App.xaml вручную ваш .csproj будет:

<Page Include ="App.xaml">
       <DependentUpon>MSBuild:Compile</DependentUpon>
       <SubType>Code</SubType>
</Page>

Измените это на:

<ApplicationDefinition Include="App.xaml">
    <Generator>MSBuild:Compile</Generator>
    <SubType>Designer</SubType>
</ApplicationDefinition>
0 голосов
/ 14 августа 2017

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

Мне потребовалось применить противоположный подход к Андреасу Калеру, чтобы исправить:

После создания файла окна и установки URI запуска для этого файла я переключил Page на Определение приложения из App.xaml 'BuildДействие 'свойство.

...