ฉันเป็นมือใหม่ในการเขียนโปรแกรม แต่ฉันแน่ใจว่าหนึ่งในกฎสากลคือโปรแกรมเริ่มต้นด้วย 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>