No Main () en WPF?

128

Soy un principiante cuando se trata de programación, pero estaba seguro de que una de las reglas universales era que un programa comienza con Main (). No veo uno cuando creo un proyecto WPF. ¿Main () simplemente nombra algo diferente en WPF?

Jugo
fuente
13
Puede obtener la funcionalidad equivalente anulando OnStartup en App.xaml.cs. StartupEventArgs.Args contiene los argumentos de la línea de comandos.
Foole
1
@Foole, no, no puedes, mira esta pregunta.
Sinatr

Respuestas:

73

Se genera durante la compilación, pero puede proporcionar el suyo (desambigándolo en las propiedades del proyecto según sea necesario). Busque en obj / debug un archivo de aplicación; Tengo (cortesía de "C # 2010 Express") App.g.i.cscon:

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();
        }
    }
}
Marc Gravell
fuente
1
También existe lo mismo en App.g.cs. Pero intenté agregar Main()y cada vez que reconstruía mi proyecto, volvería a lo que tienes aquí. Intenté crear el mío en otra clase, pero Project Properties solo encuentra MyProject.App, no la otra clase, por lo que no puedo redirigirlo.
vapcguy
1
Alternativamente, abrir App.xaml.csen estudio visual. Use la barra de navegación> Lista desplegable Método> seleccionar Main(atenuado). Esto le llevará a App.g.i.cs.
P.Brian.Mackey
136

El método Main () se crea automáticamente. Si desea proporcionar el suyo propio, debe hacerlo (probado en VS2013 y VS2017):

  • Haga clic con el botón derecho en App.xaml en el explorador de soluciones, seleccione Propiedades
  • Cambie 'Build Action' a 'Page' (el valor inicial es 'ApplicationDefinition')

Luego simplemente agregue un método Main () a App.xaml.cs. Podría ser así:

[STAThread]
public static void Main()
{
    var application = new App();
    application.InitializeComponent();
    application.Run();
}
Andreas Kahler
fuente
2
[STAThread] establece el modelo de subprocesamiento COM para su aplicación. Por lo general, simplemente lo configura en STA y no tiene que preocuparse por lo que hace exactamente. En caso de que esté interesado, visite msdn.microsoft.com/de-de/library/…
Andreas Kahler el
¡No hagas esto! Esto interrumpirá permanentemente los recursos estáticos definidos en App.xaml en Estilos en el Diseñador para todo el proyecto.
Himbeer
13

Main() es proporcionado automáticamente por el CLR y el WPF.

El compilador de C # toma un modificador de línea de comandos /mque especifica el tipo que contiene la implementación de Main(). Por convención, si no se especifica explícitamente ningún objeto de inicio, el CLR buscará cualquier clase que tenga un Main()método estático y lo llamará. (Como señaló @Marc Gravel en su comentario)

En el caso de WPF, Main()se genera automáticamente cuando App.xamlse construye y se especifica el modificador / m para que el compilador de C # use esa clase como punto de entrada. Sin embargo, si observa las propiedades del proyecto, encontrará que hay una configuración para que elija el objeto de inicio. Entonces, si lo desea, puede proporcionar su propia clase que implementeMain() .

Tenga en cuenta que esto le asignará la responsabilidad de crear la Applicationinstancia y llamar a su Run()método para garantizar que la infraestructura de WPF se inicie correctamente.

Franci Penov
fuente
En realidad, sin /mella no le importa cómo se llama el tipo; Si no es explícito, solo intenta encontrar algúnMain método adecuado y se queja si encuentra 0 o más de uno. Como ejemplo, la muestra "Hello World" en la especificación del lenguaje (§1.1) se usa Hellocomo el nombre del tipo.
Marc Gravell
2
Para ser pedante: no es realmente exacto decir que main()es proporcionado por el CLR (el tiempo de ejecución), es realmente el compilador que lo genera.
Hank
Agregué mi +1 para recordarle a la audiencia que tendrán que agregar su propia instancia de Aplicación (es decir MyApp.App app = new MyApp.App();) y llamarla .Run(), como lo Main()hubiera hecho anteriormente . Buena llamada. Además, tendría que agregar app.InitializeComponent();antes app.Run(), y afortunadamente para nosotros, el InitializeComponent()método original todavía está allí (visto en App.g.cs, ¡así que no es necesario volver a agregarlo!).
vapcguy
7

Main()se genera durante la compilación. Puede encontrarlo en App.g.cs(en la obj/{Debug,Release}carpeta).

Vlad
fuente
6

main()es un punto de entrada estándar para una aplicación, pero todas las aplicaciones están estructuradas de esa manera. En un proyecto XAML, el archivo App.XAML especifica el punto de entrada donde dice StartupUri="MainWindow.xaml".

Como lo afirman otros, la función principal real se genera en función del contenido de los archivos XAML en el proyecto.

Annath
fuente
1

Copié archivos que no se cargarían en otro proyecto que estaba sin una ventana principal en uno nuevo y obtuve este error.

Para mí fue necesario hacer el enfoque opuesto a Andreas Kahler para solucionarlo:

Después de crear un archivo de ventana y configurar la uri de inicio para este archivo, cambié la página a ApplicationDefinition de la propiedad App.xaml 'Build Action'.

Declan Taylor
fuente
0

En caso de que haya eliminado App.xaml y MinWindow.xaml predeterminados, es mejor editar .csproj Después de agregar App.xaml manualmente, su .csproj será:

<Page Include ="App.xaml">
       <DependentUpon>MSBuild:Compile</DependentUpon>
       <SubType>Code</SubType>
</Page>

Cambia esto a:

<ApplicationDefinition Include="App.xaml">
    <Generator>MSBuild:Compile</Generator>
    <SubType>Designer</SubType>
</ApplicationDefinition>
usuario10372515
fuente