Không có Main () trong WPF?


128

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?


13
Bạn có thể có được chức năng tương đương bằng cách ghi đè OnStartup trong App.xaml.cs. StartupEventArss.Arss chứa các đối số dòng lệnh.
Đánh lừa

1
@Foole, không, bạn không thể, xem câu hỏi này .
Sinatr

Câu trả lời:


73

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.csvớ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();
        }
    }
}

1
Điều tương tự cũng tồn tại 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ó.
vapcguy

1
Ngoài ra, mở App.xaml.cstrong 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.
P.Brian.Mackey

136

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):

  • Bấm chuột phải vào App.xaml trong trình khám phá giải pháp, chọn Thuộc tính
  • Thay đổi 'Xây dựng hành động' thành 'Trang' (giá trị ban đầu là 'ApplicationDefDef')

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();
}

2
[STAThread] đặt mô hình luồng COM cho ứng dụng của bạn. Thông thường bạn chỉ cần đặt nó thành STA và không phải lo lắng chính xác những gì nó làm. Trong trường hợp bạn quan tâm, hãy xem msdn.microsoft.com/de-de/l Library / trộm
Andreas Kahler

Đừng làm điều này! Điều này sẽ phá vỡ vĩnh viễn Nguồn tĩnh được xác định trong App.xaml trong Kiểu trong Trình thiết kế cho toàn bộ dự án.
Himbeer

13

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 /mchỉ đị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 Applicationcá 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.


Trên thực tế, không có /mnó 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 Hellolàm tên loại.
Marc Gravell

2
Nói một cách khoa học: không thực sự chính xác khi nói rằng 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ó.
Hank

Đã thêm +1 của tôi để nhắc nhở khán giả, họ sẽ phải thêm vào ví dụ Ứng dụng của riêng họ (ví dụ 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 đó!).
vapcguy

7

Main()được tạo ra trong quá trình biên dịch. Bạn có thể tìm thấy nó trong App.g.cs(trong obj/{Debug,Release}thư mục).


6

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.


1

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'.


0

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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.