Tôi là người mới bắt đầu lập trình nhưng tôi chắc chắn rằng một trong những quy tắc phổ biến là chương trình bắt đầu với Main (). Tôi không thấy cái nào khi tạo dự án WPF. Có phải Main () được đặt tên đơn giản là một cái gì đó khác nhau trong WPF?
Tôi là người mới bắt đầu lập trình nhưng tôi chắc chắn rằng một trong những quy tắc phổ biến là chương trình bắt đầu với Main (). Tôi không thấy cái nào khi tạo dự án WPF. Có phải Main () được đặt tên đơn giản là một cái gì đó khác nhau trong WPF?
Câu trả lời:
Nó được tạo ra trong quá trình xây dựng, nhưng bạn có thể cung cấp của riêng bạn (định nghĩa nó trong các thuộc tính dự án khi cần thiết). Tìm trong obj / debug cho một tệp ứng dụng; Tôi có (lịch sự của "C # 2010 Express") App.g.i.cs
với:
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
. Nhưng tôi đã cố gắng thêm vào Main()
và mỗi lần tôi xây dựng lại dự án của mình, nó sẽ trở lại với những gì bạn có, ở đây. Đã thử tạo riêng của tôi trong một lớp khác, nhưng Project Properties chỉ tìm thấy MyProject.App, không phải lớp khác, vì vậy không thể chuyển hướng nó.
App.xaml.cs
trong studio hình ảnh. Sử dụng thanh điều hướng> Danh sách thả xuống Phương thức> chọn Main
(chuyển sang màu xám). Điều này đưa bạn đến App.g.i.cs
.
Phương thức Main () được tạo tự động. Nếu bạn muốn tự cung cấp, bạn phải (đã thử nghiệm trong VS2013 và VS2017):
Sau đó, chỉ cần thêm một phương thức Main () vào App.xaml.cs. Nó có thể như thế này:
[STAThread]
public static void Main()
{
var application = new App();
application.InitializeComponent();
application.Run();
}
Main()
được CLR và WPF tự động cung cấp.
Trình biên dịch C # có một chuyển đổi dòng lệnh /m
chỉ định loại có chứa việc thực hiện Main()
. Theo quy ước, nếu không có đối tượng khởi động được chỉ định rõ ràng, CLR sẽ tra cứu bất kỳ lớp nào có Main()
phương thức tĩnh và sẽ gọi nó. (Như @Marc Gravel đã chỉ ra trong bình luận của anh ấy)
Trong trường hợp WPF, Main()
tự động được tạo khi App.xaml
được xây dựng và khóa chuyển đổi / m được chỉ định để làm cho trình biên dịch C # sử dụng lớp đó làm điểm vào. Tuy nhiên, nếu bạn nhìn vào các thuộc tính của dự án, bạn sẽ thấy có một cài đặt để bạn chọn đối tượng khởi động. Vì vậy, nếu bạn muốn, bạn có thể cung cấp lớp của riêng bạn thực hiệnMain()
.
Lưu ý rằng điều này sẽ đặt trách nhiệm cho bạn trong việc tạo Application
cá thể và gọi Run()
phương thức của nó để đảm bảo rằng cơ sở hạ tầng WPF được khởi động đúng cách.
/m
nó không quan tâm loại được gọi là gì; nếu bạn không rõ ràng, nó chỉ cố gắng tìm bất kỳMain
phương thức phù hợp nào và phàn nàn nếu nó tìm thấy 0 hoặc nhiều hơn một. Ví dụ, mẫu "Hello World" trong thông số ngôn ngữ (§1.1) sử dụng Hello
làm tên loại.
main()
được cung cấp bởi CLR (thời gian chạy), nó thực sự là trình biên dịch tạo ra nó.
MyApp.App app = new MyApp.App();
) và gọi .Run()
nó, giống như trước đây Main()
. Cuộc gọi tốt Ngoài ra, sẽ phải thêm app.InitializeComponent();
trước đó app.Run()
và may mắn thay cho chúng tôi, InitializeComponent()
phương thức ban đầu vẫn còn đó (xem trong App.g.cs, vì vậy không cần phải thêm lại phương thức đó!).
main()
là một điểm vào tiêu chuẩn cho một ứng dụng, nhưng tất cả các ứng dụng được cấu trúc theo cách đó. Trong dự án XAML, tệp App.XAML chỉ định điểm vào nơi nó nóiStartupUri="MainWindow.xaml"
.
Như đã nói bởi những người khác, chức năng chính thực tế được tạo ra dựa trên nội dung của các tệp XAML trong dự án.
Tôi đã sao chép các tệp không tải trong dự án khác mà không có luồng chính vào dự án mới và gặp lỗi này.
Đối với tôi, nó đã thực hiện cách tiếp cận ngược lại với Andreas Kahler để khắc phục:
Sau khi tạo một tệp cửa sổ và thiết lập uri khởi động thành tệp này, tôi đã chuyển Trang sang ApplicationDefDef của thuộc tính App.xaml 'Build Action'.
Trong trường hợp bạn đã xóa App.xaml và MinWindow.xaml mặc định, tốt hơn là chỉnh sửa .csproj Sau khi thêm App.xaml theo cách thủ công, .csproj của bạn sẽ là:
<Page Include ="App.xaml">
<DependentUpon>MSBuild:Compile</DependentUpon>
<SubType>Code</SubType>
</Page>
Thay đổi điều này thành:
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>