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?

MrDatabase
sumber

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.

Perangkat LunakJedi
sumber
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;
}
Mark Brackett
sumber
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'.

Scott Munro
sumber
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. :)

Aron Tsang
sumber
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 );
kuda pucat
sumber
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
}
Esteban Araya
sumber
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.

crashmstr
sumber
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.
Vern DeHaven
sumber
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.

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

2 sen saya:

Anda dapat menemukan kode kesalahan sistem di sini: https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx

Anda akan menemukan kode-kode khas seperti 2 untuk "file tidak ditemukan" atau 5 untuk "akses ditolak".

Dan ketika Anda menemukan kode yang tidak dikenal, Anda dapat menggunakan perintah ini untuk mencari tahu artinya:

net helpmsg decimal_code

misalnya

bantuan bersih 1

kembali

Fungsi yang salah

Fred Mauroy
sumber
0

Gunakan kode ini

Environment.Exit(0);

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

Swastik Bhattacharyya
sumber
Ini tidak menjawab pertanyaan OP dan mengembalikan 0 mengembalikan sesuatu ...
PL