ไม่มี Main () ใน WPF?


128

ฉันเป็นมือใหม่ในการเขียนโปรแกรม แต่ฉันแน่ใจว่าหนึ่งในกฎสากลคือโปรแกรมเริ่มต้นด้วย Main () ฉันไม่เห็นเมื่อฉันสร้างโครงการ WPF Main () ตั้งชื่อสิ่งที่แตกต่างกันใน WPF หรือไม่


13
คุณสามารถรับฟังก์ชันที่เทียบเท่าได้โดยการแทนที่ OnStartup ใน App.xaml.cs StartupEventArgs.Args มีอาร์กิวเมนต์ commandline
Foole

1
@Foole ไม่มีคุณไม่สามารถดูนี้คำถาม
Sinatr

คำตอบ:


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ในสตูดิโอภาพ ใช้แถบนำทาง> รายการวิธีการแบบหล่นลง> เลือกMain(เป็นสีเทา) App.g.i.csนี้จะพาคุณไป
P. Brian.Mackey

136

เมธอด Main () ถูกสร้างขึ้นโดยอัตโนมัติ หากคุณต้องการจัดหาของคุณเองคุณต้อง (ทดสอบใน VS2013 และ VS2017):

  • คลิกขวาที่ App.xaml ในตัวสำรวจโซลูชันเลือกคุณสมบัติ
  • เปลี่ยน 'Build Action' เป็น 'Page' (ค่าเริ่มต้นคือ '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/…
Andreas Kahler

อย่าทำแบบนี้! สิ่งนี้จะทำลาย StaticResources ที่กำหนดไว้ใน App.xaml อย่างถาวรในสไตล์ในตัวออกแบบสำหรับทั้งโครงการ
Himbeer

13

Main() ได้รับการจัดเตรียมโดยอัตโนมัติโดย CLR และ WPF

เรียบเรียง C # ใช้สวิตช์บรรทัดคำสั่งที่ระบุชนิดที่มีการดำเนินงานของ/m Main()ตามแบบแผนหากไม่มีการระบุอ็อบเจ็กต์เริ่มต้นอย่างชัดเจน CLR จะค้นหาคลาสใด ๆ ที่มีMain()เมธอดแบบคงที่และจะเรียกมัน (ตามที่ @Marc Gravel ชี้ให้เห็นในความคิดเห็นของเขา)

ในกรณีของ WPF ระบบMain()จะสร้างขึ้นโดยอัตโนมัติเมื่อApp.xamlสร้างขึ้นและมีการระบุสวิตช์ / m เพื่อให้คอมไพลเลอร์ C # ใช้คลาสนั้นเป็นจุดเริ่มต้น อย่างไรก็ตามหากคุณดูคุณสมบัติของโครงการคุณจะพบว่ามีการตั้งค่าให้คุณเลือกวัตถุเริ่มต้น ดังนั้นหากคุณต้องการคุณสามารถจัดเตรียมชั้นเรียนของคุณเองที่ดำเนินการMain()ได้

โปรดทราบว่าสิ่งนี้จะให้ความรับผิดชอบกับคุณในการสร้างApplicationอินสแตนซ์และเรียกRun()ใช้เมธอดเพื่อให้แน่ใจว่าโครงสร้างพื้นฐาน WPF เริ่มต้นอย่างถูกต้อง


จริงๆแล้วโดย/mไม่สนใจว่าจะเรียกว่าประเภทใด ถ้าคุณไม่ได้อย่างชัดเจนก็แค่พยายามที่จะหาใด ๆที่เหมาะสมMainวิธีการและบ่นหากพบ 0 หรือมากกว่าหนึ่ง ตัวอย่างเช่นตัวอย่าง "Hello World" ในข้อกำหนดภาษา (§1.1) ใช้Helloเป็นชื่อประเภท
Marc Gravell

2
เพื่อเป็นการอวดดี: มันไม่ถูกต้องจริงๆที่จะบอกว่าmain()จัดทำโดย CLR (รันไทม์) มันเป็นคอมไพเลอร์ที่สร้างมันขึ้นมา
แฮงค์

ที่เพิ่มเข้ามาของฉัน +1 สำหรับการเตือนผู้ชมที่พวกเขาจะต้องมีการเพิ่มในกรณีของตัวเองแอพลิเคชัน (คือMyApp.App app = new MyApp.App();) และโทร.Run()ในนั้นเหมือนก่อนหน้านี้Main()จะมี โทร. นอกจากนี้จะต้องเพิ่มapp.InitializeComponent();ก่อนapp.Run()และโชคดีสำหรับเราInitializeComponent()วิธีการดั้งเดิมยังคงอยู่ที่นั่น (ดูใน App.g.cs ดังนั้นไม่จำเป็นต้องเพิ่มกลับ!)
vapcguy

7

Main()ถูกสร้างขึ้นระหว่างการคอมไพล์ คุณสามารถค้นหาได้ในApp.g.cs(ในobj/{Debug,Release}โฟลเดอร์)


6

main()เป็นจุดเริ่มต้นมาตรฐานสำหรับแอปพลิเคชัน แต่แอปพลิเคชันทั้งหมดมีโครงสร้างในลักษณะนั้น ในโครงการ XAML แฟ้ม app.xaml StartupUri="MainWindow.xaml"ระบุจุดเริ่มต้นที่จะกล่าวว่า

ตามที่ระบุไว้โดยผู้อื่นฟังก์ชันหลักที่แท้จริงจะถูกสร้างขึ้นตามเนื้อหาของไฟล์ XAML ในโครงการ


1

ฉันคัดลอกไฟล์ที่จะไม่โหลดในโปรเจ็กต์อื่นที่ไม่มีหน้าต่างหลักไปไว้ในไฟล์ใหม่และได้รับข้อผิดพลาดนี้

สำหรับฉันแล้วการทำแนวทางตรงกันข้ามกับ Andreas Kahler เพื่อแก้ไข:

หลังจากสร้างไฟล์หน้าต่างและตั้งค่า uri เริ่มต้นเป็นไฟล์นี้ฉันเปลี่ยน Page เป็น ApplicationDefinition ของคุณสมบัติ 'Build Action' ของ App.xaml


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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.