2010-04-22 6 views
89

Je suis un débutant quand il s'agit de programmation mais j'étais sûr que l'une des règles universelles était qu'un programme commence par Main(). Je n'en vois pas quand je crée un projet WPF. Main() est-il simplement nommé différemment dans WPF?Non Main() dans WPF?

+10

Vous pouvez obtenir la fonctionnalité équivalente en remplaçant OnStartup dans App.xaml.cs. StartupEventArgs.Args contient les arguments de la ligne de commande. – Foole

+1

@Foole, non, vous ne pouvez pas, voir [this] (http://stackoverflow.com/q/22460116/1997232) question. – Sinatr

Répondre

57

Il est généré au cours de la construction, mais vous pouvez en créer un (en le désambiguant dans les propriétés du projet si nécessaire). Regardez dans obj/debug pour un fichier d'application; J'ai (avec la permission de "C# 2010 Express") App.g.i.cs avec:

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 même chose existe également dans 'App.g.cs'. Mais j'ai essayé d'ajouter 'Main()' et chaque fois que je reconstruisais mon projet, il revenait à ce que tu avais, ici. J'ai essayé de créer le mien dans une autre classe, mais Project Properties ne trouve que MyProject.App, pas l'autre classe, donc je ne peux pas le rediriger. – vapcguy

6

Main() est généré pendant la compilation. Vous pouvez le trouver dans App.g.cs (dans le dossier obj/{Debug,Release}).

5

main() est un point d'entrée standard pour une application, mais toutes les applications sont structurées de cette façon. Dans un projet XAML, le fichier App.XAML spécifie le point d'entrée où il est indiqué StartupUri="MainWindow.xaml".

Comme cela est indiqué par d'autres, la fonction principale réelle est générée sur la base du contenu des fichiers XAML dans le projet.

12

Main() est automatiquement fourni par le CLR et le WPF. Le compilateur C# prend un commutateur de ligne de commande /m qui spécifie le type qui contient l'implémentation de Main().Par convention, si aucun objet de démarrage n'est explicitement spécifié, le CLR recherchera toute classe ayant une méthode Main() statique et l'appellera. (Comme @Marc Gravel a souligné dans son commentaire)

Dans le cas de WPF, le Main() est généré automatiquement lorsque App.xaml est construit et le commutateur/m est spécifié pour que le compilateur C# utilise cette classe comme point d'entrée. Cependant, si vous regardez les propriétés du projet, vous trouverez un paramètre vous permettant de choisir l'objet de démarrage. Donc, si vous le souhaitez, vous pouvez fournir votre propre classe qui implémente Main(). Notez que cela vous mettra la responsabilité de créer l'instance Application et d'appeler sa méthode Run() pour vous assurer que l'infrastructure WPF est correctement démarrée.

+0

En fait, sans '/ m' il ne se soucie pas de savoir quel type est appelé; Si vous n'êtes pas explicite, il essaie juste de trouver ** n'importe quelle méthode 'Main' appropriée, et se plaint s'il en trouve 0 ou plus d'un. A titre d'exemple, l'exemple "Hello World" dans la spécification de langage (§1.1) utilise "Hello" comme nom de type. –

+1

Pour être pédant: il n'est pas vraiment précis de dire que 'main()' est fourni par le CLR (le runtime), c'est vraiment le compilateur qui le génère. –

+0

Ajout de mon +1 pour rappeler au public qu'ils devront ajouter dans leur propre instance d'application (ieApplicationApp MyApp.Application = new MyApp.App(); ') et appeler' .Run() 'dessus, comme le précédent 'Main()' aurait. Bon appel. De plus, il faudrait ajouter 'app.InitializeComponent();' avant 'app.Run()', et heureusement pour nous, la méthode originale 'InitializeComponent()' est toujours là (vu dans App.g.cs, donc non besoin d'ajouter celui-là!). – vapcguy

66

La méthode Main() est créée automatiquement. Si vous voulez fournir votre propre que vous avez à (testé dans VS2013 et VS2017):

  • bouton droit sur App.xaml dans l'explorateur de solution, sélectionnez Propriétés
  • Change « Build Action » à « Page » (la valeur initiale est 'ApplicationDefinition')

Puis ajoutez simplement une méthode Main() à App.xaml.cs. Il pourrait ressembler à ceci:

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

Le conseil d'action de construction était la clé, merci – joshcomley

+3

Impressionnant! devrait être la réponse acceptée. – Jack

+1

Qu'est-ce que '[STAThread]'? Je suis aussi un débutant et je ne sais pas ... – Jepessen

0

je copiais des fichiers qui ne se charge pas dans un autre projet qui était sans mainwindow dans une nouvelle et a cette erreur.

Pour moi, il a fallu faire face l'approche de Andreas Kahler pour fixer:

Après avoir fait un fichier de la fenêtre et le réglage de la mise en service uri ce fichier à la page je suis passé ApplicationDefinition de App.xaml « Build Action » propriété.