Нет Main () в WPF?


128

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


13
Вы можете получить эквивалентную функциональность, переопределив OnStartup в App.xaml.cs. StartupEventArgs.Args содержит аргументы командной строки.
Foole

1
@Foole, нет, нельзя, см. Этот вопрос.
Sinatr

Ответы:


73

Он создается во время сборки, но вы можете предоставить свой собственный (при необходимости устраняя неоднозначность в свойствах проекта). Найдите файл приложения в 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();
        }
    }
}

1
То же самое существует и в App.g.cs. Но я пытался добавить что-то, Main()и каждый раз, когда я перестраивал свой проект, он возвращался к тому, что у вас есть здесь. Пытался создать свой собственный в другом классе, но Project Properties находит только MyProject.App, а не другой класс, поэтому не может перенаправить его.
vapcguy 08

1
Или откройте App.xaml.csв Visual Studio. Используйте панель навигации> раскрывающийся список Метод> выберите Main(выделено серым). Это приведет вас к App.g.i.cs.
P.Brian.Mackey

136

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

  • Щелкните правой кнопкой мыши файл App.xaml в обозревателе решений и выберите пункт «Свойства».
  • Измените действие сборки на страницу (начальное значение - ApplicationDefinition)

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

[STAThread]
public static void Main()
{
    var application = new App();
    application.InitializeComponent();
    application.Run();
}

2
[STAThread] устанавливает модель потоковой передачи COM для вашего приложения. Обычно вы просто устанавливаете его на STA и не беспокоитесь о том, что именно он делает. Если вам интересно, посетите msdn.microsoft.com/de-de/library/…
Андреас Калер,

Не делай этого! Это навсегда нарушит статические ресурсы, определенные в App.xaml в стилях конструктора для всего проекта.
Himbeer

13

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

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

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

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


Собственно, без /mнего все равно, как называется тип; если вы не указываете явно, он просто пытается найти любой подходящий Mainметод и жалуется, если находит 0 или более одного. Например, образец «Hello World» в спецификации языка (§1.1) использует в Helloкачестве имени типа.
Марк Гравелл

2
Чтобы быть педантичным: не совсем точно сказать, что main()это предоставляется CLR (среда выполнения), это действительно компилятор, который его генерирует.
Хэнк

Добавлен мой +1 для напоминания аудитории, что им придется добавить свой собственный экземпляр приложения (т.е. MyApp.App app = new MyApp.App();) и вызвать .Run()его, как и в предыдущем Main()случае. Хороший звонок. Кроме того, пришлось бы добавить app.InitializeComponent();раньше app.Run(), и, к счастью для нас, исходный InitializeComponent()метод все еще существует (показан в App.g.cs, поэтому нет необходимости добавлять его обратно!).
vapcguy 08

7

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


6

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

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


1

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

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

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


0

Если вы удалили 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>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.