Tidak Main () di WPF?


128

Saya seorang pemula ketika datang ke pemrograman tapi saya yakin bahwa salah satu aturan universal adalah bahwa program dimulai dengan Main (). Saya tidak melihat satu ketika saya membuat proyek WPF. Apakah Main () hanya memberi nama yang berbeda di WPF?


13
Anda bisa mendapatkan fungsionalitas yang setara dengan menimpa OnStartup di App.xaml.cs. StartupEventArgs.Args berisi argumen commandline.
Bodoh

1
@ Bodoh, tidak, Anda tidak bisa, lihat pertanyaan ini .
Sinatr

Jawaban:


73

Itu dihasilkan selama membangun, tetapi Anda dapat memberikan Anda sendiri (disambiguasi dalam properti proyek yang diperlukan). Lihat di obj / debug untuk file aplikasi; Saya punya (milik "C # 2010 Express") App.g.i.csdengan:

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
Hal yang sama juga ada di sana App.g.cs. Tetapi saya mencoba untuk menambah Main()dan setiap kali saya akan membangun kembali proyek saya, itu akan kembali ke apa yang Anda miliki, di sini. Mencoba membuat sendiri di kelas lain, tetapi Project Properties hanya menemukan MyProject.App, bukan kelas lain, jadi tidak bisa mengarahkan ulang.
vapcguy

1
Atau, buka App.xaml.csdi studio visual. Gunakan bilah navigasi> Metode drop down list> select Main(greyed out). Ini membawa Anda ke App.g.i.cs.
P.Brian.Mackey

136

Metode Main () dibuat secara otomatis. Jika Anda ingin menyediakan sendiri, Anda harus (diuji dalam VS2013 dan VS2017):

  • Klik kanan App.xaml di penjelajah solusi, pilih Properti
  • Ubah 'Bangun Tindakan' ke 'Halaman' (nilai awal adalah 'ApplicationDefinition')

Kemudian cukup tambahkan metode Main () ke App.xaml.cs. Bisa seperti ini:

[STAThread]
public static void Main()
{
    var application = new App();
    application.InitializeComponent();
    application.Run();
}

2
[STAThread] mengatur model threading COM untuk aplikasi Anda. Biasanya Anda hanya mengaturnya ke STA dan tidak perlu khawatir apa fungsinya sebenarnya. Jika Anda tertarik, periksa msdn.microsoft.com/de-de/library/…
Andreas Kahler

Jangan lakukan ini! Ini akan secara permanen memecah StaticResources yang ditentukan di App.xaml di Styles dalam Designer untuk seluruh proyek.
Himbeer

13

Main() secara otomatis disediakan oleh CLR dan WPF.

Compiler C # mengambil saklar baris perintah /myang menentukan jenis yang berisi implementasi Main(). Dengan konvensi, jika tidak ada objek startup yang secara eksplisit ditentukan, CLR akan mencari kelas yang memiliki Main()metode statis dan akan memanggilnya. (Seperti yang ditunjukkan oleh @Marc Gravel dalam komentarnya)

Dalam kasus WPF, Main()secara otomatis dihasilkan ketika App.xamldibangun dan / m switch ditentukan untuk membuat kompiler C # menggunakan kelas itu sebagai titik masuk. Jika Anda melihat properti proyek, Anda akan menemukan ada pengaturan bagi Anda untuk memilih objek startup. Jadi jika Anda mau, Anda bisa menyediakan kelas Anda sendiri yang mengimplementasikan Main().

Perhatikan bahwa ini akan membuat Anda bertanggung jawab untuk membuat Applicationinstance dan memanggil Run()metodenya untuk memastikan bahwa infrastruktur WPF dimulai dengan benar.


Sebenarnya, tanpa /mitu tidak peduli apa jenisnya; jika Anda tidak eksplisit hanya mencoba untuk menemukan setiap cocok Mainmetode, dan mengeluh jika menemukan 0 atau lebih dari satu. Sebagai contoh, sampel "Hello World" dalam spesifikasi bahasa (§1.1) digunakan Hellosebagai nama tipe.
Marc Gravell

2
Menjadi bertele-tele: itu tidak benar-benar akurat untuk mengatakan bahwa main()disediakan oleh CLR (runtime), itu benar-benar kompiler yang menghasilkannya.
Hank

Menambahkan +1 saya untuk mengingatkan pemirsa bahwa mereka harus menambahkan contoh Aplikasi mereka sendiri (yaitu MyApp.App app = new MyApp.App();) dan memanggilnya .Run(), seperti yang sebelumnya Main()akan miliki. Panggilan yang bagus. Juga, harus menambahkan app.InitializeComponent();sebelumnya app.Run(), dan untungnya bagi kita, InitializeComponent()metode asli masih ada (lihat di App.g.cs, jadi tidak perlu menambahkan itu kembali!).
vapcguy

7

Main()dihasilkan selama kompilasi. Anda dapat menemukannya di App.g.cs(dalam obj/{Debug,Release}folder).


6

main()adalah titik masuk standar untuk suatu aplikasi, tetapi semua aplikasi disusun dengan cara itu. Dalam proyek XAML, file App.XAML menentukan titik masuk di mana dikatakanStartupUri="MainWindow.xaml" .

Seperti yang dinyatakan oleh orang lain, fungsi utama sebenarnya dihasilkan berdasarkan isi file XAML dalam proyek.


1

Saya menyalin file yang tidak akan dimuat di proyek lain yang tanpa jendela utama ke yang baru dan mendapatkan kesalahan ini.

Bagi saya perlu melakukan pendekatan yang berlawanan dengan Andreas Kahler untuk memperbaikinya:

Setelah membuat file window dan mengatur startup uri ke file ini saya beralih Page ke ApplicationDefinition of App.xaml properti 'Build Action'.


0

Jika Anda menghapus App.xaml dan MinWindow.xaml default, lebih baik mengedit .csproj Setelah menambahkan App.xaml secara manual, .csproj Anda adalah:

<Page Include ="App.xaml">
       <DependentUpon>MSBuild:Compile</DependentUpon>
       <SubType>Code</SubType>
</Page>

Ubah ini menjadi:

<ApplicationDefinition Include="App.xaml">
    <Generator>MSBuild:Compile</Generator>
    <SubType>Designer</SubType>
</ApplicationDefinition>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.