2010-04-22 22 views
89

Sono un principiante quando si parla di programmazione, ma ero sicuro che una delle regole universali era che un programma inizia con Main(). Non ne vedo uno quando creo un progetto WPF. Main() ha semplicemente chiamato qualcosa di diverso in WPF?No Main() in WPF?

+10

È possibile ottenere la funzionalità equivalente sovrascrivendo OnStartup in App.xaml.cs. StartupEventArgs.Args contiene gli argomenti della riga di comando. – Foole

+1

@Foole, no, non puoi, vedi [questo] (http://stackoverflow.com/q/22460116/1997232) domanda. – Sinatr

risposta

57

Viene generato durante la compilazione, ma è possibile fornire il proprio (disambigendolo nelle proprietà del progetto, se necessario). Cerca in obj/debug per 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(); 
     } 
    } 
} 
+0

La stessa cosa esiste anche in "App.g.cs". Ma ho provato ad aggiungere a 'Main()' e ogni volta che ricostruivo il mio progetto, tornava a quello che hai, qui. Ho cercato di crearne di propri in un'altra classe, ma Project Properties trova solo MyProject.App, non l'altra classe, quindi non può reindirizzarlo. – vapcguy

6

Main() viene generato durante la compilazione. Puoi trovarlo in App.g.cs (nella cartella obj/{Debug,Release}).

5

main() è un punto di ingresso standard per un'applicazione, ma tutte le applicazioni sono strutturati in questo modo. In un progetto XAML, il file App.XAML specifica il punto di ingresso dove viene indicato StartupUri="MainWindow.xaml".

Come indicato da altri, la funzione principale effettiva viene generata in base al contenuto dei file XAML nel progetto.

12

Main() viene fornito automaticamente dal CLR e dal WPF.

Il compilatore C# accetta uno switch da 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 cerca qualsiasi classe che abbia un metodo statico Main() e la chiamerà. (Come @ Marc Gravel sottolineato nel suo commento)

Nel caso del WPF, il Main() viene generato automaticamente quando App.xaml è costruito e il m interruttore/è specificato per rendere il compilatore C# utilizzare tale classe come punto di ingresso. Tuttavia, se si guardano le proprietà del progetto, si troverà un'impostazione per scegliere l'oggetto di avvio. Quindi, se lo desideri, puoi fornire la tua classe che implementa Main().

Si noti che questo vi darà la responsabilità di creare l'istanza Application e di chiamare il suo metodo Run() per garantire che l'infrastruttura WPF sia avviata correttamente.

+0

In realtà, senza '/ m' non * cura * come viene chiamato il tipo; se non sei esplicito, prova a trovare ** qualsiasi ** metodo 'Main' adatto, e si lamenta se trova 0 o più di uno. Ad esempio, l'esempio "Hello World" nella specifica della lingua (§1.1) utilizza 'Hello' come nome del tipo. –

+1

Essere pedante: non è molto preciso dire che 'main()' è fornito dal CLR (il runtime), è davvero il compilatore che lo genera. –

+0

Aggiunto il mio +1 per ricordare al pubblico che dovranno aggiungere nella propria istanza dell'applicazione (ad esempio 'App MyApp.App = new MyApp.App();') e chiamare '.Run()' su di esso, come il precedente 'Main()' avrebbe. Buona chiamata Inoltre, dovremmo aggiungere 'app.InitializeComponent();' prima di 'app.Run()', e fortunatamente per noi, il metodo originale 'InitializeComponent()' è ancora lì (visto in App.g.cs, quindi no è necessario aggiungere quello indietro!). – vapcguy

66

Il metodo Main() viene creato automaticamente. Se si desidera fornire il proprio dovete (testato in VS2013 e VS2017):

  • pulsante destro del mouse App.xaml nella soluzione Explorer, selezionare Proprietà
  • Change 'Build azione' a 'Pagina' (il valore iniziale è 'ApplicationDefinition')

Quindi basta aggiungere un metodo Main() a App.xaml.cs. Potrebbe essere simile a questo:

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

Il suggerimento per la build era la chiave, grazie – joshcomley

+3

Fantastico! dovrebbe essere la risposta accettata – Jack

+1

Cosa significa '[STAThread]'? Sono anche un principiante e non lo so ... – Jepessen

0

ho copiato i file che non sarebbe caricare in un altro progetto, che era senza un MainWindow in uno nuovo e ottenuto questo errore.

Per me ci sono voluti fare un approccio opposto a Andreas Kahler per risolvere:

Dopo aver effettuato un file finestra e impostando l'URI di avvio per questo file sono passato alla Pagina ApplicationDefinition di App.xaml 'Build Azione' proprietà.

Problemi correlati