WPF中没有Main()?


128

我是编程方面的初学者,但是我确定通用规则之一是程序以Main()开头。创建WPF项目时看不到一个。是Main()只是在WPF中以不同的方式命名吗?


13
您可以通过重写App.xaml.cs中的OnStartup获得等效功能。StartupEventArgs.Args包含命令行参数。
Foole,2010年

1
@Fooole,不,您不能,看到这个问题。
Sinatr

Answers:


73

它是在构建期间生成的,但是您可以提供自己的文件(必要时在项目属性中对其进行歧义消除)。在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();
        }
    }
}

1
同样的东西也存在于中App.g.cs。但是,我尝试添加到其中,Main()并且每次重新构建项目时,它都会还原为此处的内容。试图在另一个类中创建自己的类,但是Project Properties仅找到MyProject.App,而不是另一个类,因此无法重定向它。
vapcguy

1
或者,App.xaml.cs在Visual Studio中打开。使用导航栏>方法下拉列表>选择Main(灰色)。这将带您到App.g.i.cs
P.Brian.Mackey,

136

Main()方法是自动创建的。如果要提供自己的产品,则必须(在VS2013和VS2017中测试):

  • 在解决方案资源管理器中右键单击App.xaml,选择“属性”。
  • 将“生成操作”更改为“页面”(初始值为“ ApplicationDefinition”)

然后只需将Main()方法添加到App.xaml.cs。可能是这样的:

[STAThread]
public static void Main()
{
    var application = new App();
    application.InitializeComponent();
    application.Run();
}

2
[STAThread]为您的应用程序设置COM线程模型。通常,您只需将其设置为STA,而不必担心它的确切功能。如果你有兴趣,请msdn.microsoft.com/de-de/library/...
安德烈亚斯·凯勒

不要这样!这将永久破坏整个项目在Designer的“样式”中App.xaml中定义的StaticResources。
希姆贝尔

13

Main() 由CLR和WPF自动提供。

C#编译器采用命令行开关/m,该开关指定包含实现的类型Main()。按照约定,如果未明确指定启动对象,则CLR将查找具有静态Main()方法的任何类并将其调用。(正如@Marc Gravel在其评论中指出的那样)

对于WPF,将Main()App.xaml构建时自动生成,并指定/ m开关以使C#编译器使用该类作为入口点。但是,如果您查看项目属性,则会发现有一个设置供您选择启动对象。因此,如果需要,您可以提供自己的实现的类Main()

请注意,这将使您有责任创建Application实例并调用其Run()方法以确保WPF基础结构正确启动。


实际上,没有/m它并不在乎该类型是什么。如果您不明确,它只会尝试找到任何合适的Main方法,并抱怨它找到0或多个。例如,语言规范(第1.1节)中的“ Hello World”示例Hello用作类型名称。
马克·格拉韦尔

2
简单地说:main()由CLR(运行时)提供的说法并不是很准确,实际上是由编译器生成的。
汉克2015年

添加了我的+1,以提醒听众他们将不得不像以前一样添加自己的Application实例(即MyApp.App app = new MyApp.App();)并对其进行调用。好决定。另外,还必须在之前添加,幸运的是,对于我们来说,原始方法仍然存在(在App.g.cs中可见,因此无需添加该方法!)。.Run()Main()app.InitializeComponent();app.Run()InitializeComponent()
vapcguy

7

Main()在编译期间生成。您可以在App.g.csobj/{Debug,Release}文件夹中)找到它。


6

main()是应用程序的标准入口点,但是所有应用程序都是以这种方式构造的。在XAML项目中,App.XAML文件在其上面指定了入口点StartupUri="MainWindow.xaml"

正如其他人所述,实际的主要功能是根据项目中XAML文件的内容生成的。


1

我将无法在没有主窗口的另一个项目中加载的文件复制到一个新项目中,并收到此错误。

对我来说,它采取了与Andreas Kahler相反的方法来解决:

制作完一个窗口文件并将启动uri设置为此文件后,我将Page切换为App.xaml的“ Build Action”属性的ApplicationDefinition。


0

如果您删除了默认的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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.