Sono un principiante quando si tratta di programmazione, ma ero sicuro che una delle regole universali fosse che un programma inizia con Main (). Non ne vedo uno quando creo un progetto WPF. Main () è semplicemente chiamato in modo diverso in WPF?
Sono un principiante quando si tratta di programmazione, ma ero sicuro che una delle regole universali fosse che un programma inizia con Main (). Non ne vedo uno quando creo un progetto WPF. Main () è semplicemente chiamato in modo diverso in WPF?
Risposte:
Viene generato durante la compilazione, ma è possibile fornire il proprio (chiarendolo in base alle proprietà del progetto, se necessario). Cerca in obj / debug un file app; Ho (per gentile concessione di "C # 2010 Express") App.g.i.cs
con:
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
anche in. Ma ho provato ad aggiungere Main()
e ogni volta che avrei ricostruito il mio progetto, sarebbe tornato a quello che hai, qui. Ho provato a crearne uno mio in un'altra classe, ma Project Properties trova solo MyProject.App, non l'altra classe, quindi non posso reindirizzarlo.
App.xaml.cs
in Visual Studio. Utilizzare la barra di navigazione> Elenco a discesa Metodo> seleziona Main
(disattivato). Questo ti porta a App.g.i.cs
.
Il metodo Main () viene creato automaticamente. Se vuoi fornire il tuo devi (testato in VS2013 e VS2017):
Quindi aggiungi un metodo Main () a App.xaml.cs. Potrebbe essere così:
[STAThread]
public static void Main()
{
var application = new App();
application.InitializeComponent();
application.Run();
}
Main()
viene fornito automaticamente dal CLR e dal WPF.
Il compilatore C # accetta un'opzione della riga di comando /m
che specifica il tipo che contiene l'implementazione di Main()
. Per convenzione, se non viene specificato esplicitamente alcun oggetto di avvio, CLR cercherà qualsiasi classe che abbia un Main()
metodo statico e lo chiamerà. (Come ha sottolineato @Marc Gravel nel suo commento)
Nel caso di WPF, Main()
viene generato automaticamente quando App.xaml
viene creato e l' opzione / m viene specificata per fare in modo che il compilatore C # utilizzi quella classe come punto di ingresso. Tuttavia, se si guardano le proprietà del progetto, si trova un'impostazione per la scelta dell'oggetto di avvio. Quindi, se vuoi, puoi fornire la tua classe che implementa Main()
.
Tieni presente che ciò ti assumerà la responsabilità di creare l' Application
istanza e di chiamarne il Run()
metodo per garantire che l'infrastruttura WPF sia avviata correttamente.
/m
essa non importa come si chiama il tipo; se non sei esplicito, cerca solo di trovare unMain
metodo adatto e si lamenta se trova 0 o più di uno. Ad esempio, l'esempio "Hello World" nelle specifiche della lingua (§1.1) utilizza Hello
come nome del tipo.
main()
è fornito dal CLR (il runtime), è proprio il compilatore che lo genera.
MyApp.App app = new MyApp.App();
) E chiamarlo .Run()
, come Main()
avrebbe fatto il precedente . Ottima scelta. Inoltre, dovrei aggiungere app.InitializeComponent();
prima app.Run()
, e fortunatamente per noi, il InitializeComponent()
metodo originale è ancora lì (visto in App.g.cs, quindi non è necessario aggiungere quello indietro!).
main()
è un punto di ingresso standard per un'applicazione, ma tutte le applicazioni sono strutturate in questo modo. In un progetto XAML, il file App.XAML specifica il punto di ingresso in cui è indicato StartupUri="MainWindow.xaml"
.
Come affermato da altri, la funzione principale effettiva viene generata in base al contenuto dei file XAML nel progetto.
Ho copiato i file che non sarebbero stati caricati in un altro progetto che era senza una finestra principale in uno nuovo e ho riscontrato questo errore.
Per me ci è voluto fare l'approccio opposto ad Andreas Kahler per risolvere:
Dopo aver creato un file di finestra e aver impostato l'uri di avvio su questo file, ho passato Page a ApplicationDefinition della proprietà 'Build Action' di App.xaml.
Se hai rimosso App.xaml predefinito e MinWindow.xaml, meglio modificare .csproj Dopo aver aggiunto App.xaml manualmente, il tuo .csproj sarà:
<Page Include ="App.xaml">
<DependentUpon>MSBuild:Compile</DependentUpon>
<SubType>Code</SubType>
</Page>
Cambia questo in:
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>