146 votes

Pas de Main() dans WPF ?

Je suis un débutant en matière 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 lorsque je crée un projet WPF. Main() est-il simplement nommé différemment dans WPF ?

15 votes

Vous pouvez obtenir la fonctionnalité équivalente en surchargeant OnStartup dans App.xaml.cs. StartupEventArgs.Args contient les arguments de la ligne de commande.

2 votes

@Foole, non, vous ne pouvez pas, voir este question.

153voto

Andreas Kahler Points 2085

La méthode Main() est créée automatiquement. Si vous voulez fournir la vôtre, vous devez le faire (testé dans VS2013, VS2017 et VS2019) :

  • Cliquez avec le bouton droit de la souris sur App.xaml dans l'explorateur de solutions, puis sélectionnez Propriétés.
  • Remplacez 'Build Action' par 'Page' (la valeur initiale est 'ApplicationDefinition').

Il suffit ensuite d'ajouter une méthode Main() à App.xaml.cs. Cela pourrait être comme ceci :

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

80voto

Marc Gravell Points 482669

Il est généré pendant la construction, mais vous pouvez fournir le vôtre (en le désambiguïsant dans les propriétés du projet si nécessaire). Regardez dans obj/debug pour un fichier d'application ; j'ai (courtoisie 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();
        }
    }
}

1 votes

La même chose existe dans App.g.cs de même. Mais j'ai essayé d'ajouter à Main() et chaque fois que je reconstruisais mon projet, il revenait à ce que vous avez, 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.

2 votes

Vous pouvez également ouvrir App.xaml.cs dans le studio visuel. Utilisez la barre de navigation > Liste déroulante des méthodes > sélectionnez Main (en grisé). Vous accédez alors à App.g.i.cs .

16voto

Franci Penov Points 45358

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 un objet statique de type Main() et l'appellera. (Comme @Marc Gravel l'a souligné dans son commentaire)

Dans le cas de WPF, le Main() est automatiquement généré 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 verrez qu'il y a un paramètre qui vous permet de choisir l'objet de démarrage. Donc, si vous voulez, vous pouvez fournir votre propre classe qui implémente Main() .

Notez qu'il vous incombera de créer l'adresse de l'utilisateur. Application et appeler son Run() pour s'assurer que l'infrastructure WPF est lancée correctement.

0 votes

En fait, sans /m ce n'est pas le cas soins quel est le nom du type ; si vous n'êtes pas explicite, il essaie juste de trouver tout approprié Main et se plaint s'il trouve 0 ou plus d'un. Par exemple, l'exemple "Hello World" dans la spécification du langage (§1.1) utilise Hello comme nom de type.

3 votes

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

1 votes

J'ai ajouté mon +1 pour rappeler à l'audience qu'elle devra ajouter sa propre instance d'application (c'est à dire MyApp.App app = new MyApp.App(); ) et appeler .Run() sur elle, comme la précédente Main() l'aurait fait. Bonne décision. Aussi, je devrais ajouter app.InitializeComponent(); avant app.Run() et heureusement pour nous, l'original InitializeComponent() est toujours là (vu dans App.g.cs, donc pas besoin de la rajouter !).

10voto

Vlad Points 23480

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

6voto

Annath Points 1038

main() est un point d'entrée standard pour une application, mais toutes les applications sont structurées de cette manière. Dans un projet XAML, le fichier App.XAML spécifie le point d'entrée à l'endroit suivant StartupUri="MainWindow.xaml" .

Comme d'autres l'ont dit, la fonction principale réelle est générée en fonction du contenu des fichiers XAML du projet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X