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?
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?
Respostas:
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.cs
com:
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();
}
}
}
App.g.cs
també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.
App.xaml.cs
no visual studio. Use a barra de navegação> lista suspensa Método> selecione Main
(acinzentado). Isso leva você a App.g.i.cs
.
O método Main () é criado automaticamente. Se você deseja fornecer o seu próprio, é necessário (testado no VS2013 e VS2017):
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();
}
Main()
é fornecido automaticamente pelo CLR e pelo WPF.
O compilador C # usa uma opção de linha de comando /m
que 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 Application
instância e chamar seu Run()
método para garantir que a infraestrutura do WPF seja iniciada corretamente.
/m
ele 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 Hello
como o nome do tipo.
main()
é fornecido pelo CLR (o tempo de execução), é realmente o compilador que o gera.
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!).
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.
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'.
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>