Não Main () no WPF?

128

Sou iniciante em programação, mas tinha certeza de que uma das regras universais era que um programa fosse iniciado com Main (). Não vejo um quando crio um projeto WPF. Main () é simplesmente nomeado algo diferente no WPF?

Suco
fonte
13
Você pode obter a funcionalidade equivalente substituindo OnStartup em App.xaml.cs. StartupEventArgs.Args contém os argumentos da linha de comandos.
Foole
1
@ Foole, não, você não pode, veja esta pergunta.
Sinatr 24/03

Respostas:

73

Ele é gerado durante a construção, mas você pode fornecer o seu próprio (desambiguando-o nas propriedades do projeto, conforme necessário). Procure em obj / debug por um arquivo de aplicativo; Eu tenho (cortesia de "C # 2010 Express") App.g.i.cscom:

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
fonte
1
A mesma coisa existe App.g.cstambém. Mas eu tentei adicionar Main()e toda vez que reconstruir meu projeto, ele voltará ao que você tem aqui. Tentei criar o meu em outra classe, mas as Propriedades do projeto encontram apenas o MyProject.App, não a outra classe, portanto, não é possível redirecioná-lo.
vapcguy
1
Como alternativa, abra App.xaml.csno visual studio. Use a barra de navegação> lista suspensa Método> selecione Main(acinzentado). Isso leva você a App.g.i.cs.
usar o seguinte código
136

O método Main () é criado automaticamente. Se você deseja fornecer o seu próprio, é necessário (testado no VS2013 e VS2017):

  • Clique com o botão direito do mouse em App.xaml no gerenciador de soluções, selecione Propriedades
  • Altere 'Build Action' para 'Page' (o valor inicial é 'ApplicationDefinition')

Em seguida, basta adicionar um método Main () ao App.xaml.cs. Poderia ser assim:

[STAThread]
public static void Main()
{
    var application = new App();
    application.InitializeComponent();
    application.Run();
}
Andreas Kahler
fonte
2
[STAThread] define o modelo de encadeamento COM para seu aplicativo. Geralmente, você apenas define como STA e não precisa se preocupar com o que faz exatamente. Caso esteja interessado, consulte msdn.microsoft.com/de-de/library/…
Andreas Kahler
Não faça isso! Isso interromperá permanentemente StaticResources definido em App.xaml em Styles no Designer para todo o projeto.
Himbeer
13

Main() é fornecido automaticamente pelo CLR e pelo WPF.

O compilador C # usa uma opção de linha de comando /mque especifica o tipo que contém a implementação Main(). Por convenção, se nenhum objeto de inicialização for especificado explicitamente, o CLR pesquisará qualquer classe que tenha um Main()método estático e o chamará. (Como @Marc Gravel apontou em seu comentário)

No caso do WPF, o Main()é gerado automaticamente quando App.xamlé construído e a opção / m é especificada para fazer com que o compilador C # use essa classe como ponto de entrada. Porém, se você observar as propriedades do projeto, encontrará uma configuração para escolher o objeto de inicialização. Portanto, se você quiser, pode fornecer sua própria classe que implementa Main().

Observe que isso colocará a responsabilidade de você criar a Applicationinstância e chamar seu Run()método para garantir que a infraestrutura do WPF seja iniciada corretamente.

Franci Penov
fonte
Na verdade, sem /mele não se importa com o que o tipo é chamado; se você não for explícito, ele apenas tenta encontrar umMain método adequado e reclama se encontra 0 ou mais de um. Como exemplo, o exemplo "Hello World" na especificação de idioma (§1.1) usa Hellocomo o nome do tipo.
Marc Gravell
2
Para ser pedante: não é realmente preciso dizer que main()é fornecido pelo CLR (o tempo de execução), é realmente o compilador que o gera.
Hank
Adicionado meu +1 para lembrar o público que eles terão que adicionar em sua própria instância de aplicativo (ou seja MyApp.App app = new MyApp.App();) e invocá .Run()-lo, como o anterior Main(). Boa decisão. Além disso, teria que adicionar app.InitializeComponent();antes app.Run()e, felizmente para nós, o InitializeComponent()método original ainda está lá (visto em App.g.cs, portanto, não há necessidade de adicioná-lo de volta!).
vapcguy
7

Main()é gerado durante a compilação. Você pode encontrá-lo em App.g.cs(na obj/{Debug,Release}pasta).

Vlad
fonte
6

main()é um ponto de entrada padrão para um aplicativo, mas todos os aplicativos são estruturados dessa maneira. Em um projeto XAML, o arquivo App.XAML especifica o ponto de entrada onde diz StartupUri="MainWindow.xaml".

Como afirmado por outros, a função principal real é gerada com base no conteúdo dos arquivos XAML no projeto.

Annath
fonte
1

Copiei arquivos que não seriam carregados em outro projeto que estava sem uma janela principal em um novo e recebi esse erro.

Para mim, foi preciso fazer a abordagem oposta a Andreas Kahler para corrigir:

Depois de criar um arquivo de janela e definir a interface de inicialização para esse arquivo, mudei a página para ApplicationDefinition da propriedade App.xaml 'Build Action'.

Declan Taylor
fonte
0

Caso você tenha removido o App.xaml e o MinWindow.xaml padrão, é melhor editar .csproj Após adicionar o App.xaml manualmente, o seu .csproj será:

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

Mude para:

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