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?
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?
Antworten:
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.cs
mit:
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();
}
}
}
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.
App.xaml.cs
im Visual Studio öffnen . Verwenden Sie die Navigationsleiste> Dropdown-Liste Methode> Auswählen Main
(ausgegraut). Das bringt dich zu App.g.i.cs
.
Die Main () -Methode wird automatisch erstellt. Wenn Sie Ihre eigenen bereitstellen möchten, müssen Sie (getestet in VS2013 und VS2017):
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();
}
Main()
wird automatisch von der CLR und der WPF bereitgestellt.
Der C # -Compiler verwendet einen Befehlszeilenschalter, /m
der 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.xaml
wird, 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 Application
Instanz zu erstellen und ihre Run()
Methode aufzurufen , um sicherzustellen, dass die WPF-Infrastruktur ordnungsgemäß gestartet wird.
/m
es nicht egal , was die Art genannt wird; Wenn Sie nicht explizit sind, versucht es nur, eine geeignete Main
Methode 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) Hello
als Typname verwendet .
main()
dies von der CLR (der Laufzeit) bereitgestellt wird, es ist wirklich der Compiler, der es generiert.
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!).
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.
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'.
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>