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?


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();
        }
    }
}

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();
}

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.


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


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.


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


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>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.