ฉันเป็นมือใหม่ในการเขียนโปรแกรม แต่ฉันแน่ใจว่าหนึ่งในกฎสากลคือโปรแกรมเริ่มต้นด้วย Main () ฉันไม่เห็นเมื่อฉันสร้างโครงการ WPF Main () ตั้งชื่อสิ่งที่แตกต่างกันใน WPF หรือไม่
ฉันเป็นมือใหม่ในการเขียนโปรแกรม แต่ฉันแน่ใจว่าหนึ่งในกฎสากลคือโปรแกรมเริ่มต้นด้วย Main () ฉันไม่เห็นเมื่อฉันสร้างโครงการ WPF Main () ตั้งชื่อสิ่งที่แตกต่างกันใน WPF หรือไม่
คำตอบ:
มันถูกสร้างขึ้นในระหว่างการสร้าง แต่คุณสามารถระบุของคุณเองได้ (แยกความคลุมเครือในคุณสมบัติโครงการตามความจำเป็น) ดูใน 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();
}
}
}
App.g.cs
เช่นกัน แต่ฉันพยายามเพิ่มMain()
และทุกครั้งที่ฉันสร้างโปรเจ็กต์ใหม่มันจะเปลี่ยนกลับไปเป็นสิ่งที่คุณมีที่นี่ พยายามสร้างของตัวเองในคลาสอื่น แต่ Project Properties พบเฉพาะ MyProject.App ไม่ใช่คลาสอื่นจึงไม่สามารถเปลี่ยนเส้นทางได้
App.xaml.cs
ในสตูดิโอภาพ ใช้แถบนำทาง> รายการวิธีการแบบหล่นลง> เลือกMain
(เป็นสีเทา) App.g.i.cs
นี้จะพาคุณไป
เมธอด Main () ถูกสร้างขึ้นโดยอัตโนมัติ หากคุณต้องการจัดหาของคุณเองคุณต้อง (ทดสอบใน VS2013 และ VS2017):
จากนั้นเพิ่มเมธอด Main () ใน App.xaml.cs อาจเป็นเช่นนี้:
[STAThread]
public static void Main()
{
var application = new App();
application.InitializeComponent();
application.Run();
}
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
เป็นชื่อประเภท
main()
จัดทำโดย CLR (รันไทม์) มันเป็นคอมไพเลอร์ที่สร้างมันขึ้นมา
MyApp.App app = new MyApp.App();
) และโทร.Run()
ในนั้นเหมือนก่อนหน้านี้Main()
จะมี โทร. นอกจากนี้จะต้องเพิ่มapp.InitializeComponent();
ก่อนapp.Run()
และโชคดีสำหรับเราInitializeComponent()
วิธีการดั้งเดิมยังคงอยู่ที่นั่น (ดูใน App.g.cs ดังนั้นไม่จำเป็นต้องเพิ่มกลับ!)
Main()
ถูกสร้างขึ้นระหว่างการคอมไพล์ คุณสามารถค้นหาได้ในApp.g.cs
(ในobj/{Debug,Release}
โฟลเดอร์)
main()
เป็นจุดเริ่มต้นมาตรฐานสำหรับแอปพลิเคชัน แต่แอปพลิเคชันทั้งหมดมีโครงสร้างในลักษณะนั้น ในโครงการ XAML แฟ้ม app.xaml StartupUri="MainWindow.xaml"
ระบุจุดเริ่มต้นที่จะกล่าวว่า
ตามที่ระบุไว้โดยผู้อื่นฟังก์ชันหลักที่แท้จริงจะถูกสร้างขึ้นตามเนื้อหาของไฟล์ XAML ในโครงการ
ฉันคัดลอกไฟล์ที่จะไม่โหลดในโปรเจ็กต์อื่นที่ไม่มีหน้าต่างหลักไปไว้ในไฟล์ใหม่และได้รับข้อผิดพลาดนี้
สำหรับฉันแล้วการทำแนวทางตรงกันข้ามกับ Andreas Kahler เพื่อแก้ไข:
หลังจากสร้างไฟล์หน้าต่างและตั้งค่า uri เริ่มต้นเป็นไฟล์นี้ฉันเปลี่ยน Page เป็น ApplicationDefinition ของคุณสมบัติ 'Build Action' ของ App.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>