Brak elementu Main () w WPF?

128

Jestem początkującym jeśli chodzi o programowanie, ale byłem pewien, że jedną z uniwersalnych zasad było to, że program zaczyna się od Main (). Nie widzę żadnego, gdy tworzę projekt WPF. Czy Main () jest po prostu nazwany inaczej w WPF?

Sok
źródło
13
Możesz uzyskać równoważną funkcjonalność, zastępując OnStartup w App.xaml.cs. StartupEventArgs.Args zawiera argumenty wiersza polecenia.
Foole
1
@Foole, nie, nie możesz, zobacz to pytanie.
Sinatr

Odpowiedzi:

73

Jest generowany podczas kompilacji, ale możesz podać swój własny (ujednoznaczniając go we właściwościach projektu, jeśli to konieczne). Poszukaj w obj / debug pliku aplikacji; Mam (dzięki uprzejmości „C # 2010 Express”) App.g.i.csz:

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();
        }
    }
}
Marc Gravell
źródło
1
To samo istnieje App.g.csrównież w programie. Ale próbowałem Main()coś dodać i za każdym razem, gdy odbudowywałem swój projekt, wracał do tego, co masz tutaj. Próbowałem utworzyć własną w innej klasie, ale właściwości projektu znajdują tylko MyProject.App, a nie inną klasę, więc nie mogę go przekierować.
vapcguy
1
Alternatywnie otwórz App.xaml.csw programie Visual Studio. Użyj paska nawigacji> Lista rozwijana Metoda> wybierz Main(wyszarzona). To prowadzi do App.g.i.cs.
P.Brian.Mackey
136

Metoda Main () jest tworzona automatycznie. Jeśli chcesz udostępnić swój własny, musisz (przetestowany w VS2013 i VS2017):

  • Kliknij prawym przyciskiem myszy plik App.xaml w eksploratorze rozwiązań, wybierz opcję Właściwości
  • Zmień „Build Action” na „Page” (wartość początkowa to „ApplicationDefinition”)

Następnie po prostu dodaj metodę Main () do App.xaml.cs. Może to wyglądać tak:

[STAThread]
public static void Main()
{
    var application = new App();
    application.InitializeComponent();
    application.Run();
}
Andreas Kahler
źródło
2
[STAThread] ustawia model wątków COM dla twojej aplikacji. Zwykle po prostu ustawiasz go na STA i nie musisz się martwić, co dokładnie robi. Jeśli jesteś zainteresowany, sprawdź msdn.microsoft.com/de-de/library/…
Andreas Kahler
Nie rób tego! Spowoduje to trwałe uszkodzenie zasobów StaticResources zdefiniowanych w App.xaml w Styles w Projektancie dla całego projektu.
Himbeer
13

Main() jest automatycznie udostępniana przez środowisko CLR i WPF.

Kompilator C # przyjmuje przełącznik wiersza polecenia, /mktóry określa typ zawierający implementację Main(). Zgodnie z konwencją, jeśli nie określono jawnie żadnego obiektu startowego, środowisko CLR wyszuka każdą klasę, która ma Main()metodę statyczną , i wywoła ją. (Jak zauważył @Marc Gravel w swoim komentarzu)

W przypadku WPF Main()jest generowany automatycznie, gdyApp.xaml jest kompilowany, a przełącznik / m jest określony, aby kompilator C # używał tej klasy jako punktu wejścia. Jeśli jednak spojrzysz na właściwości projektu, przekonasz się, że istnieje ustawienie umożliwiające wybranie obiektu startowego. Więc jeśli chcesz, możesz dostarczyć własną klasę, która implementujeMain() .

Zwróć uwagę, że spowoduje to nałożenie na Ciebie odpowiedzialności za utworzenie Applicationwystąpienia i wywołanie jego Run()metody, aby zapewnić prawidłowe uruchomienie infrastruktury WPF.

Franci Penov
źródło
Właściwie bez /mniego nie obchodzi, jak nazywa się typ; jeśli nie są jednoznaczne to po prostu stara się znaleźć żadnej odpowiedniej Mainmetody, i narzeka, jeżeli stwierdzi 0 lub więcej niż jeden. Na przykład przykład „Hello World” w specyfikacji języka (§1.1) używa Hellojako nazwy typu.
Marc Gravell
2
Mówiąc pedantycznie: nie jest dokładne stwierdzenie, że main()jest dostarczane przez CLR (środowisko uruchomieniowe), tak naprawdę to kompilator go generuje.
Hank
Dodano moje +1, aby przypomnieć odbiorcom, że będą musieli dodać własną instancję aplikacji (tj. MyApp.App app = new MyApp.App();) I wywołać .Run()ją, tak jak poprzednio Main(). Dobra decyzja. Musiałbym również dodać app.InitializeComponent();wcześniej app.Run()i na szczęście dla nas oryginalna InitializeComponent()metoda nadal istnieje (widoczna w App.g.cs, więc nie ma potrzeby dodawania jej z powrotem!).
vapcguy
7

Main()jest generowany podczas kompilacji. Możesz go znaleźć w App.g.cs(w obj/{Debug,Release}folderze).

Vlad
źródło
6

main()to standardowy punkt wejścia do aplikacji, ale wszystkie aplikacje mają taką strukturę. W projekcie XAML plik App.XAML określa punkt wejścia, w którym jest napisanyStartupUri="MainWindow.xaml" .

Jak twierdzą inni, rzeczywista główna funkcja jest generowana na podstawie zawartości plików XAML w projekcie.

Annath
źródło
1

Skopiowałem pliki, które nie były ładowane w innym projekcie, który był bez głównego okna, do nowego i otrzymałem ten błąd.

W moim przypadku trzeba było zastosować odwrotne podejście do Andreasa Kahlera, aby naprawić:

Po utworzeniu pliku okna i ustawieniu startowego URI na ten plik przełączyłem Page na ApplicationDefinition we właściwości 'Build Action' App.xaml.

Declan Taylor
źródło
0

Jeśli usunąłeś domyślne App.xaml i MinWindow.xaml, lepiej edytować plik .csproj Po ręcznym dodaniu App.xaml, plik .csproj będzie:

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

Zmień to na:

<ApplicationDefinition Include="App.xaml">
    <Generator>MSBuild:Compile</Generator>
    <SubType>Designer</SubType>
</ApplicationDefinition>
user10372515
źródło