Kein Main () in WPF?

128

Ich bin ein Anfänger in Sachen Programmierung, aber ich war mir sicher, dass eine der universellen Regeln war, dass ein Programm mit Main () beginnt. Ich sehe keine, wenn ich ein WPF-Projekt erstelle. Wird Main () in WPF einfach anders benannt?

Saft
quelle
13
Sie können die entsprechende Funktionalität erhalten, indem Sie OnStartup in App.xaml.cs überschreiben. StartupEventArgs.Args enthält die Befehlszeilenargumente.
Foole
1
@Foole, nein, du kannst diese Frage nicht sehen .
Sinatr

Antworten:

73

Es wird während des Builds generiert, aber Sie können Ihr eigenes bereitstellen (bei Bedarf in Projekteigenschaften eindeutig definieren). Suchen Sie in obj / debug nach einer App-Datei. Ich habe (mit freundlicher Genehmigung von "C # 2010 Express") App.g.i.csmit:

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
quelle
1
Das gleiche gibt es auch in App.g.cs. Aber ich habe versucht, etwas hinzuzufügen, Main()und jedes Mal, wenn ich mein Projekt neu aufbaute, kehrte es zu dem zurück, was Sie hier haben. Es wurde versucht, meine eigene in einer anderen Klasse zu erstellen, aber Project Properties findet nur MyProject.App, nicht die andere Klasse, kann es also nicht umleiten.
Vapcguy
1
Alternativ App.xaml.csim Visual Studio öffnen . Verwenden Sie die Navigationsleiste> Dropdown-Liste Methode> Auswählen Main(ausgegraut). Das bringt dich zu App.g.i.cs.
P.Brian.Mackey
135

Die Main () -Methode wird automatisch erstellt. Wenn Sie Ihre eigenen bereitstellen möchten, müssen Sie (getestet in VS2013 und VS2017):

  • Klicken Sie im Lösungs-Explorer mit der rechten Maustaste auf App.xaml, und wählen Sie Eigenschaften aus
  • Ändern Sie 'Build Action' in 'Page' (Anfangswert ist 'ApplicationDefinition')

Fügen Sie dann einfach eine Main () -Methode zu App.xaml.cs hinzu. Es könnte so sein:

[STAThread]
public static void Main()
{
    var application = new App();
    application.InitializeComponent();
    application.Run();
}
Andreas Kahler
quelle
2
[STAThread] legt das COM-Threading-Modell für Ihre Anwendung fest. Normalerweise stellen Sie es einfach auf STA ein und müssen sich keine Sorgen machen, was es genau tut. Wenn
Andreas Kahler
Tu das nicht! Dadurch werden die in App.xaml in Styles im Designer definierten StaticResources für das gesamte Projekt dauerhaft unterbrochen.
Himbeer
13

Main() wird automatisch von der CLR und der WPF bereitgestellt.

Der C # -Compiler verwendet einen Befehlszeilenschalter, /mder den Typ angibt, der die Implementierung von enthält Main(). Wenn kein Startobjekt explizit angegeben wird, sucht die CLR standardmäßig nach einer Klasse mit einer statischen AufladungMain() Methode und ruft diese auf. (Wie @Marc Gravel in seinem Kommentar betonte)

Im Fall von WPF wird das Main()automatisch generiert, wenn es erstellt App.xamlwird, und der Schalter / m wird angegeben, damit der C # -Compiler diese Klasse als Einstiegspunkt verwendet. Wenn Sie sich jedoch die Projekteigenschaften ansehen, werden Sie feststellen, dass Sie das Startobjekt auswählen können. Wenn Sie möchten, können Sie Ihre eigene Klasse bereitstellen, die implementiert wirdMain() .

Beachten Sie, dass Sie dafür verantwortlich sind, die ApplicationInstanz zu erstellen und ihre Run()Methode aufzurufen , um sicherzustellen, dass die WPF-Infrastruktur ordnungsgemäß gestartet wird.

Franci Penov
quelle
Eigentlich ohne /mes nicht egal , was die Art genannt wird; Wenn Sie nicht explizit sind, versucht es nur, eine geeignete MainMethode zu finden , und beschwert sich, wenn es 0 oder mehr als eine findet. Als Beispiel wird das Beispiel "Hello World" in der Sprachspezifikation (§1.1) Helloals Typname verwendet .
Marc Gravell
2
Um pedantisch zu sein: Es ist nicht wirklich genau zu sagen, dass main()dies von der CLR (der Laufzeit) bereitgestellt wird, es ist wirklich der Compiler, der es generiert.
Hank
Ich habe meine +1 hinzugefügt, um die Zielgruppe daran zu erinnern, dass sie in ihrer eigenen Anwendungsinstanz (dh MyApp.App app = new MyApp.App();) hinzufügen und sie aufrufen .Run()muss, wie es die vorherige Main()getan hätte. Guter Anruf. Außerdem würde hinzufügen müssen , app.InitializeComponent();bevor app.Run(), und zum Glück für uns, die ursprüngliche InitializeComponent()Methode ist immer noch da (in App.g.cs gesehen, so dass keine Notwendigkeit , dass man zurück zu addieren!).
Vapcguy
7

Main()wird während der Kompilierung generiert. Sie finden es in App.g.cs(im obj/{Debug,Release}Ordner).

Vlad
quelle
6

main()ist ein Standardeinstiegspunkt für eine Anwendung, aber alle Anwendungen sind so strukturiert. In einem XAML-Projekt gibt die App.XAML-Datei den Einstiegspunkt an, an dem sie stehtStartupUri="MainWindow.xaml" .

Wie von anderen angegeben, wird die eigentliche Hauptfunktion basierend auf dem Inhalt der XAML-Dateien im Projekt generiert.

Annath
quelle
1

Ich habe Dateien, die nicht in ein anderes Projekt ohne Hauptfenster geladen wurden, in ein neues kopiert und diesen Fehler erhalten.

Für mich war es umgekehrt, Andreas Kahler zu helfen:

Nachdem ich eine Fensterdatei erstellt und die Start-URL auf diese Datei gesetzt hatte, wechselte ich Page zu ApplicationDefinition der App.xaml-Eigenschaft 'Build Action'.

Declan Taylor
quelle
0

Falls Sie die Standard-App.xaml und MinWindow.xaml entfernt haben, ist es besser, .csproj zu bearbeiten. Nach dem manuellen Hinzufügen von App.xaml lautet Ihre .csproj:

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

Ändern Sie dies in:

<ApplicationDefinition Include="App.xaml">
    <Generator>MSBuild:Compile</Generator>
    <SubType>Designer</SubType>
</ApplicationDefinition>
user10372515
quelle