在编程方面,我是初学者,但我确信通用规则之一是程序以 Main() 开头。当我创建一个 WPF 项目时,我没有看到一个。Main() 在 WPF 中只是简单地命名了一些不同的东西吗?
7 回答
Main() 方法是自动创建的。如果你想提供你自己的,你必须(在 VS2013、VS2017 和 VS2019 中测试):
- 在解决方案资源管理器中右键单击 App.xaml,选择属性
- 将“构建操作”更改为“页面”(初始值为“ApplicationDefinition”)
然后只需将 Main() 方法添加到 App.xaml.cs。它可能是这样的:
[STAThread]
public static void Main()
{
var application = new App();
application.InitializeComponent();
application.Run();
}
它是在构建期间生成的,但您可以提供自己的(根据需要在项目属性中消除歧义)。在 obj/debug 中查找应用程序文件;我有(由“C# 2010 Express”App.g.i.cs
提供):
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();
}
}
}
Main()
由 CLR 和 WPF 自动提供。
C# 编译器采用命令行开关/m
,该开关指定包含Main()
. 按照惯例,如果没有显式指定启动对象,CLR 将查找任何具有静态Main()
方法的类并调用它。(正如@Marc Gravel 在他的评论中指出的那样)
对于 WPF,在构建Main()
时会自动生成 ,App.xaml
并指定 /m 开关以使 C# 编译器使用该类作为入口点。但是,如果您查看项目属性,您会发现有一个设置供您选择启动对象。因此,如果您愿意,您可以提供自己的实现Main()
.
请注意,这将使您有责任创建Application
实例并调用其Run()
方法以确保 WPF 基础结构正确启动。
Main()
在编译期间生成。您可以在App.g.cs
(obj/{Debug,Release}
文件夹中)找到它。
main()
是应用程序的标准入口点,但所有应用程序都是以这种方式构建的。在 XAML 项目中,App.XAML 文件指定它所说的入口点StartupUri="MainWindow.xaml"
。
正如其他人所说,实际的 main 函数是根据项目中 XAML 文件的内容生成的。
如果您删除了默认 App.xaml 和 MinWindow.xaml,最好编辑 .csproj 手动添加 App.xaml 后,您的 .csproj 将是:
<Page Include ="App.xaml">
<DependentUpon>MSBuild:Compile</DependentUpon>
<SubType>Code</SubType>
</Page>
将其更改为:
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
我将不会加载到另一个没有主窗口的项目中的文件复制到一个新项目中并出现此错误。
对我来说,它需要对 Andreas Kahler 采取相反的方法来解决:
在制作了一个窗口文件并将启动 uri 设置为此文件后,我将 Page 切换到 App.xaml 'Build Action' 属性的 ApplicationDefinition。