2010-04-22 24 views
89

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 de WPF. ¿Main() simplemente nombra algo diferente en WPF?Sin Main() en WPF?

+10

Puede obtener la funcionalidad equivalente anulando OnStartup en App.xaml.cs. StartupEventArgs.Args contiene los argumentos de línea de comandos. – Foole

+1

@Foole, no, no puede, vea [esto] (http://stackoverflow.com/q/22460116/1997232) pregunta. – Sinatr

Respuesta

57

Se genera durante la compilación, pero puede proporcionarla la suya (no necesita ambigüedad en las propiedades del proyecto). Busca en obj/debug un archivo de aplicación; Tengo (cortesía de "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

Lo mismo existe en 'App.g.cs', también. Pero traté de agregar a '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 puede redirigirlo. – vapcguy

6

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

5

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

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

12

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

El compilador C# toma un modificador de línea de comandos /m que 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 método estático Main() y lo llamará. (Como @Marc grava señalado en su comentario)

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

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

+0

En realidad, sin '/ m' no le importa * qué tipo se llama; si no eres explícito, simplemente intenta encontrar ** cualquier ** método 'Principal 'adecuado, y se queja si encuentra 0 o más de uno. Como ejemplo, el ejemplo "Hello World" en la especificación de idioma (§1.1) usa 'Hello' como nombre de tipo. –

+1

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. –

+0

Agregué mi +1 para recordarle a la audiencia que ellos tendrán que agregar en su propia instancia de aplicación (es decir, 'Aplicación MyApp.App = new MyApp.App();') y llamar a '.Run()' sobre ella, como la anterior 'Main()' tendría. Buena llamada. Además, tendría que agregar 'app.InitializeComponent();' antes de 'app.Run()', y afortunadamente para nosotros, el método original 'InitializeComponent()' todavía está allí (visto en App.g.cs, entonces no necesito agregar esa otra vez!). – vapcguy

66

El método Main() se crea automáticamente. Si desea proporcionar su propio tienes que (probado en VS2013 y VS2017):

  • Haga clic derecho en App.xaml en el explorador de soluciones, seleccione Propiedades
  • cambio 'Construir Acción' a 'Página' (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(); 
} 
+10

La sugerencia de acción de construcción fue la clave, gracias – joshcomley

+3

¡Impresionante! debería ser la respuesta aceptada. – Jack

+1

¿Qué es '[STAThread]'? También soy un principiante y no sé ... – Jepessen

0

he copiado los archivos que no se carga en otro proyecto que fue sin MainWindow en uno nuevo y se puso este error.

Para mí tomaron haciendo el camino contrario a Andreas Kahler para fijar:

Después de hacer un archivo de la ventana y ajuste de la URI de inicio a este archivo cambié a Página ApplicationDefinition de App.xaml 'Construir Acción' propiedad.