Bagaimana cara menentukan kode keluar dari aplikasi konsol di .NET?


471

Saya punya aplikasi konsol sepele di .NET. Itu hanya bagian uji aplikasi yang lebih besar. Saya ingin menentukan "kode keluar" dari aplikasi konsol saya. Bagaimana saya melakukan ini?

Jawaban:


599

3 pilihan:

  • Anda dapat mengembalikannya Mainjika Anda menyatakan Mainmetode Anda untuk kembali int.
  • Anda bisa menelepon Environment.Exit(code).
  • Anda dapat mengatur kode keluar menggunakan properti: Environment.ExitCode = -1;. Ini akan digunakan jika tidak ada lagi yang mengatur kode pengembalian atau menggunakan salah satu opsi lain di atas).

Bergantung pada aplikasi Anda (konsol, layanan, aplikasi web, dll) metode yang berbeda dapat digunakan.


12
Bagi Anda yang bertanya-tanya mengapa ini tidak berhasil dalam kasus mereka, pastikan proyek Anda dikompilasi sebagai "Aplikasi konsol" dan bukan sebagai "aplikasi Windows".
Marcel Gosselin

9
bagaimana jika saya memiliki aplikasi WinForms yang dengan beberapa argumen saya ingin berperilaku sebagai aplikasi konsol?
sebagomez

5
Anda juga bisa mengetikkan program maine sebagai int (ganti void dengan int) dan gunakan misalnya "return -1;" untuk kembali dari program utama. Ini lebih portabel daripada Lingkungan. Keluar () (yang tergantung pada lingkungan).
werner

14
@DannyBeckett Secara konvensi, kode keluar 0berarti sukses, dan bukan nol berarti kegagalan. return;menunjukkan keberhasilan melalui kode keluar 0, dan return -1;menunjukkan kegagalan.
allonhadaya

6
Anda juga dapat mengatur kode keluar menggunakan properti: Environment.ExitCode = -1;
t3b4n

270

Selain jawaban yang mencakup int kembali ... permohonan untuk kewarasan. Tolong, tolong tentukan kode keluar Anda dalam enum, dengan Bendera jika perlu. Itu membuat debugging dan pemeliharaan jauh lebih mudah (dan, sebagai bonus, Anda dapat dengan mudah mencetak kode keluar di layar bantuan Anda - Anda memiliki salah satunya, kan?).

enum ExitCode : int {
  Success = 0,
  InvalidLogin = 1,
  InvalidFilename = 2,
  UnknownError = 10
}

int Main(string[] args) {
   return (int)ExitCode.Success;
}

46
Anda mungkin ingin menambahkan, bahwa nilai "0" untuk "Sukses" bukan kebetulan, tetapi sebenarnya nilai "standar" untuk situasi itu.
Christian.K

39
INI. Inilah sebabnya mengapa SO adalah situs web terbesar dalam sejarah internet. Nasihat ini tidak tersedia di buku teks apa pun, dan hanya dapat diperoleh dengan berbicara dengan profesional berpengalaman. TERIMA KASIH.
Daniel Szabo

17
Anda mengatakan bahwa 0 adalah nilai standar untuk sukses, namun ketika mengonversi 0/1 menjadi boolean, 0 salah dan 1 benar! Mungkin lebih akurat untuk mengatakan bahwa kode keluar 0 berarti "tidak ada kesalahan", daripada "sukses", karena kode keluar adalah ErrorResult bukan hanya Hasil.
Mark Shapiro

11
Untuk daftar lengkap konvensi microsoft, lihat msdn.microsoft.com/en-us/library/windows/desktop/… . Beberapa pria telah membuat daftar besar consts dan menggunakannya dalam kotak saklar di komentar lebih lanjut di bawah ini.
nawfal

5
@ MarkShapiro, saya kira 0 = Successberasal dari kenyataan bahwa hanya ada satu kode keberhasilan yang diperlukan, tetapi banyak kode kesalahan, sehingga 0, karena tidak memiliki + atau - dalam bilangan bulat Komputer, dapat digunakan untuk secara unik mengidentifikasi keberhasilan
Sebastian

49

Ada tiga metode yang dapat Anda gunakan untuk mengembalikan kode keluar dari aplikasi konsol.

  1. Ubah Mainmetode dalam aplikasi Anda sehingga mengembalikan intbukan void(fungsi yang mengembalikan Integerbukan Subdi VB.Net) dan kemudian mengembalikan kode keluar dari metode itu.
  2. Setel properti Environment.ExitCode ke kode keluar. Perhatikan bahwa metode 1. diutamakan - jika Mainmetode mengembalikan apa pun selain void(adalah Subdalam VB.Net) maka nilai properti ini akan diabaikan.
  3. Lewati kode keluar ke metode Environment.Exit . Ini akan menghentikan proses segera sebagai lawan dari dua metode lainnya.

Standar penting yang harus diperhatikan adalah yang 0mewakili 'Sukses'.

Pada topik terkait, pertimbangkan untuk menggunakan enumerasi untuk menentukan kode keluar yang akan dikembalikan oleh aplikasi Anda. The FlagsAttribute akan memungkinkan Anda untuk kembali kombinasi kode.

Selain itu, pastikan aplikasi Anda dikompilasi sebagai 'Aplikasi Konsol'.


1
Ini memunculkan poin yang menarik. Pengaturan Environment.ExitCodetidak menutup program dengan segera tetapi Environment.Exitmetode segera menutup program
PsychoData

1
Kode keluar juga berfungsi pada aplikasi windows. Jika aplikasi akan dimulai dari c #, melalui Processobjek, Anda dapat meminta objek untuk WaitForExit(), dan kemudian meminta kode keluar dari itu.
Nyerguds

43

Jika Anda akan menggunakan metode yang disarankan oleh David, Anda juga harus melihat Atribut [Bendera].

Ini memungkinkan Anda untuk melakukan operasi sedikit bijak pada enum.

[Flags]
enum ExitCodes : int
{
  Success = 0,
  SignToolNotInPath = 1,
  AssemblyDirectoryBad = 2,
  PFXFilePathBad = 4,
  PasswordMissing = 8,
  SignFailed = 16,
  UnknownError = 32
}

Kemudian

(ExitCodes.SignFailed | ExitCodes.UnknownError)

akan menjadi 16 + 32. :)


3
Ini menyiratkan bahwa suatu program akan mengatakan 'kata sandi Anda salah' kemudian lanjutkan untuk mencoba dan menandatangani apa pun yang ditandatanganinya, dan hanya berhenti jika gagal. Anda harus kembali setelah Anda gagal; hal lain adalah peringatan dan program masih harus mengembalikan 0.
Pete Kirkham

3
Fakta yang tidak banyak diketahui adalah bahwa [Bendera] tidak melakukan apa pun untuk mengaktifkan atau menonaktifkan operasi bitwise. Semua yang dilakukannya adalah mengganti metode ToString sehingga output mewakili flag bitwise. Dengan atau tanpa itu, Anda masih dapat melakukan operasi bitwise.
Steven

3
@ Seven itu bagus untuk diketahui tetapi saya masih merekomendasikan dekorasi enum yang dimaksudkan untuk "penggunaan bendera" dengan atribut itu, jika tidak ada yang lain itu menyampaikan niat.
MarioDS

25
int code = 2;
Environment.Exit( code );

17
Alasan teknis apa pun yang Anda tidak hanya menulis "Lingkungan. Keluar (2);" ?
Blorgbeard keluar

52
Menetapkan angka ajaib ke variabel dengan nama yang tidak berarti tidak membuatnya kurang ajaib.
Blorgbeard keluar


11

Cukup kembalikan kode yang sesuai dari utama.

int main(string[] args)
{
      return 0; //or exit code of your choice
}

2
Aplikasi konsol C # default tidak menyatakan main sama sekali. Ini menyatakan static void Main(string[] args);
Mark Lakata

19
@Mark Lakta: Lalu ubah, bukan?
Esteban Araya

11

Gunakan ExitCode jika utama Anda memiliki tanda tangan kembali kosong, jika tidak, Anda perlu "mengatur" dengan nilai yang Anda kembalikan.

Properti Environment.ExitCode

Jika metode utama mengembalikan void, Anda dapat menggunakan properti ini untuk mengatur kode keluar yang akan dikembalikan ke lingkungan panggilan. Jika Main tidak mengembalikan void, properti ini diabaikan. Nilai awal properti ini adalah nol.


8

Sebagai pembaruan untuk jawaban Scott Munro :

  • Dalam C # 6.0 dan VB.NET 14.0 (VS 2015), baik Environment.ExitCode atau Environment.Exit (exitCode) diperlukan untuk mengembalikan kode non-nol dari aplikasi konsol. Mengubah jenis pengembalian Maintidak berpengaruh.
  • Dalam F # 4.0 (VS 2015), nilai kembali dari maintitik masuk dihormati.

Bisakah poin 1 Anda tentang C # 6 diverifikasi? Sepertinya saya tidak dapat menemukan apa pun secara online. Nilai balik dari fungsi Utama dilampirkan ke kode keluar dari proses (setidaknya di semua kompiler sebelumnya), mengapa mereka harus mengubahnya?
Arman McHitarian

Bukti anekdotal murni, tapi saya hanya menemukan ini di perpustakaan saya sendiri, di mana hanya mengembalikan kode hasil / kesalahan dari Main()tidak mengatur Process.ExitCodeseperti yang terlihat oleh aplikasi panggilan.
Marcus Mangelsdorf

Kontes MSDN int Mainmasih dapat digunakan sebagai alternatif untuk Environment.ExitCode. tautan
Arman McHitarian

Saya memiliki aplikasi yang menjalankan banyak utas. Dalam keadaan tertentu, saya perlu mengalahkan beberapa utas melalui Thread.Abort (), sebelum keluar dari aplikasi. Dalam keadaan ini, int Main () {... thread.Abort (); ... return 0;} TIDAK menghasilkan kode keluar proses 0: kode keluar proses -1. Tampaknya dalam keadaan tertentu, MS telah memutuskan bahwa konvensi menggunakan nilai kembali dari utas utama untuk mengatur kode keluar dari proses, tidak cukup baik untuk mereka. Dalam keadilan, ini mungkin masalah waktu: abort thread mungkin menetapkan kode keluar sangat terlambat dalam permainan.
David I. McIntosh

7

Opsi enumerasi sangat baik namun dapat ditingkatkan dengan mengalikan angka seperti pada:

enum ExitCodes : int
{
  Success = 0,
  SignToolNotInPath = 1,
  AssemblyDirectoryBad = 2,
  PFXFilePathBad = 4,
  PasswordMissing = 8,
  SignFailed = 16,
  UnknownError = 32
}

Dalam kasus beberapa kesalahan, menambahkan nomor kesalahan spesifik bersama-sama akan memberi Anda nomor unik yang akan mewakili kombinasi kesalahan yang terdeteksi.

Misalnya, tingkat kesalahan 6 hanya bisa terdiri dari kesalahan 4 dan 2, 12 hanya bisa terdiri dari kesalahan 4 dan 8, 14 hanya bisa terdiri dari 2, 4 dan 8 dll.


2
Itu jika Anda repot-repot memeriksa kesalahan lebih lanjut setelah menemukan satu, meskipun. Sebagian besar aplikasi tidak.
Nyerguds


0

Gunakan kode ini

Environment.Exit(0);

gunakan 0 sebagai int jika Anda tidak ingin mengembalikan apa pun.


Ini tidak menjawab pertanyaan OP dan mengembalikan 0 mengembalikan sesuatu ...
PL
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.