.NET'te bir konsol uygulamasının çıkış kodunu nasıl belirlerim?


471

.NET'te önemsiz bir konsol uygulamam var. Daha büyük bir uygulamanın sadece test kısmıdır. Konsol uygulamamın "çıkış kodunu" belirtmek istiyorum. Bunu nasıl yaparım?

Yanıtlar:


599

3 seçenek:

  • İade yönteminizi Mainbeyan ederseniz Main, iade edebilirsiniz int.
  • Arayabilirsiniz Environment.Exit(code).
  • Sen özelliklerini kullanarak çıkış kodu ayarlayabilirsiniz: Environment.ExitCode = -1;. Bu, başka hiçbir şey dönüş kodunu ayarlamazsa veya yukarıdaki diğer seçeneklerden birini kullanmazsa kullanılır).

Uygulamanıza (konsol, servis, web uygulaması vb.) Bağlı olarak farklı yöntemler kullanılabilir.


12
Bunun neden işe yaramadığını merak edenler için, projenizin "Windows uygulaması" olarak değil "Konsol uygulaması" olarak derlendiğinden emin olun.
Marcel Gosselin

9
ya bazı argümanlar ile bir konsol uygulaması gibi davranmasını istiyorum bir WinForms uygulaması varsa?
sebagomez

5
Ayrıca maine programını int olarak da yazabilirsiniz (void by int yerine) ve örneğin "return -1;" ana programdan dönmek için. Bu, Environment.Exit () 'den (çevreye bağlı olarak) daha taşınabilir.
werner

14
@DannyBeckett Kural olarak, bir çıkış kodu 0başarı anlamına gelir ve sıfırdan farklı olmak başarısızlık demektir. return;çıkış kodu üzerinden başarıyı 0ve return -1;başarısızlığı gösterir.
allonhadaya

6
Çıkış kodunu özellikleri kullanarak da ayarlayabilirsiniz: Environment.ExitCode = -1;
t3b4n

270

Dönüş int kapsayan cevaplara ek olarak ... akıl sağlığı için bir savunma. Lütfen çıkış kodlarınızı bir numarada ve uygunsa Bayraklarla tanımlayın. Hata ayıklama ve bakımı çok daha kolay hale getirir (ve bir bonus olarak, çıkış kodlarını yardım ekranınıza kolayca yazdırabilirsiniz - bunlardan birine sahipsiniz, değil mi?).

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

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

46
"Başarı" için "0" değerinin tesadüfen değil, aslında bu durum için "standart" değer olduğunu eklemek isteyebilirsiniz.
Christian.K

39
BU. Bu yüzden SO internet tarihinin en büyük web sitesi. Bu tavsiye herhangi bir ders kitabında mevcut değildir ve yalnızca deneyimli bir profesyonelle konuşarak öğrenilebilir. TEŞEKKÜR EDERİM.
Daniel Szabo

17
0'ın başarı için standart değer olduğunu ve yine de 0/1'i boole'ye dönüştürürken, 0 yanlış ve 1 doğrudur! 0 çıkış kodunun "başarı" yerine "hata yok" anlamına geldiğini söylemek daha doğru olabilir, çünkü çıkış kodu yalnızca bir Sonuç değil, bir ErrorResult sonucudur.
Mark Shapiro

11
Microsoft kurallarının tam listesi için bkz. Msdn.microsoft.com/en-us/library/windows/desktop/… . Bazı adamlar çok büyük bir consts listesi yaptı ve aşağıdaki yorumlarda bir anahtar durumunda kullandı.
nawfal

5
@MarkShapiro, sanırım 0 = Successsadece bir başarı kodunun gerekli olduğu gerçeğinden geliyor, ancak birçok hata kodu, 0, bilgisayar tamsayılarında + veya - yok gibi, başarıyı benzersiz bir şekilde tanımlamak için kullanılabiliyor
Sebastian

49

Bir konsol uygulamasından bir çıkış kodu döndürmek için kullanabileceğiniz üç yöntem vardır.

  1. Değiştir Mainbir döndüren böylece uygulamada yöntemi intyerine void(döner bir bir işlevi Integeryerine Subve sonra da bu yöntemden çıkış kodunu döndürür VB.Net olarak).
  2. Set Environment.ExitCode çıkış koduna özelliği. Yöntem 1'in öncelikli olduğuna dikkat edin - Mainyöntem void( SubVB.Net'te) dışında bir şey döndürürse , bu özelliğin değeri yok sayılır.
  3. Çıkış kodunu Environment.Exit yöntemine iletin. Bu, diğer iki yöntemin aksine süreci derhal sona erdirecektir.

Gözlemlenmesi gereken önemli bir standart 0'Başarı'yı ​​temsil eder.

İlgili bir konuda, uygulamanızın döndüreceği çıkış kodlarını tanımlamak için bir numaralandırma kullanmayı düşünün. FlagsAttribute Kodlarınız bir arada dönmek sağlayacaktır.

Ayrıca, uygulamanızın bir 'Konsol Uygulaması' olarak derlendiğinden emin olun.


1
Bu ilginç bir nokta getiriyor. Ayar Environment.ExitCodedeğil yakın program hemen yapar ama Environment.Exityöntem hemen programı kapatır
PsychoData

1
Çıkış kodu Windows uygulamalarında da çalışır. Uygulama c # 'dan bir Processnesne aracılığıyla başlatılırsa, nesneyi isteyebilir WaitForExit()ve sonra çıkış kodunu isteyebilirsiniz.
Nyerguds

43

David tarafından önerilen yöntemi kullanacaksanız, [Bayraklar] Özelliğine de göz atmalısınız.

Bu, numaralandırmalarda biraz akıllıca işlemler yapmanızı sağlar.

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

Sonra

(ExitCodes.SignFailed | ExitCodes.UnknownError)

16 + 32 olurdu. :)


3
Bu, bir programın 'şifreniz yanlış' diyeceğini ve ardından imzaladığı her şeyi imzalamaya çalışacağını ve yalnızca başarısız olursa durduğunu ima eder. Başarısız olduğunuzda geri dönmelisiniz; başka bir şey bir uyarıdır ve program yine de 0'a dönmelidir.
Pete Kirkham

3
Çok az bilinen gerçek şu ki, [Bayraklar] bitsel işlemleri etkinleştirmek veya devre dışı bırakmak için hiçbir şey yapmaz. Tek yaptığı, çıktının bitsel bayrakları temsil etmesi için ToString yöntemini geçersiz kılmaktır. Onunla veya onsuz, yine de bitsel işlemler yapabilirsiniz.
Steven

3
@Steven bu bilmek güzel ama yine de "bayrak kullanımı" için tasarlanmış numaralandırmalar bu özniteliği ile süslemek için tavsiye ederim, başka bir şey değilse niyet taşır.
MarioDS

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

17
"Environment.Exit (2);" ?
Blorgbeard

52
Anlamsız bir isme sahip bir değişkene sihirli bir sayı atamak onu daha az sihir yapmaz.
Blorgbeard


11

Sadece uygun kodu main'den geri gönderin.

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

2
Varsayılan C # konsol uygulaması ana olarak hiç bildirimde bulunmaz. Bu beyan static void Main(string[] args);
Mark LAKATA

19
@ Mark Lakta: Öyleyse değiştir, değil mi?
Esteban Araya

11

Ana cihazınızda bir geçersiz dönüş imzası varsa ExitCode kullanın, aksi takdirde döndürdüğünüz değere göre "ayarlamanız" gerekir.

Environment.ExitCode Özelliği

Main yöntemi void döndürürse, arama ortamına döndürülecek çıkış kodunu ayarlamak için bu özelliği kullanabilirsiniz. Main, boşluk döndürmezse, bu özellik yoksayılır. Bu özelliğin başlangıç ​​değeri sıfırdır.


8

Scott Munro'nun cevabı için bir güncelleme olarak :

  • C # 6.0 ve VB.NET 14.0 (VS 2015) sürümlerinde , bir konsol uygulamasından sıfır olmayan bir kod döndürmek için Environment.ExitCode veya Environment.Exit (exitCode) gerekir. Dönüş türünün değiştirilmesinin bir Mainetkisi yoktur.
  • F # 4.0'da (VS 2015), maingiriş noktasının dönüş değerine uyulur.

C # 6 ile ilgili 1. noktanız doğrulanabilir mi? Çevrimiçi olarak hiçbir şey bulamıyorum. Ana işlevden döndürülen değer, işlemin çıkış koduna eklenir (en azından önceki tüm derleyicilerde), neden bunu değiştirmiş olmalılar?
Arman McHitarian

Saf anekdot kanıtı, ama ben sadece kendi kütüphanemde koştum, burada sadece sonuç / hata kodumu döndüren çağıran uygulama tarafından görüldüğü gibi Main()ayarlamadı Process.ExitCode.
Marcus Mangelsdorf

MSDN int Main, hala Ortam.ExitCode'a alternatif olarak kullanılabileceğini iddia ediyor . bağlantı
Arman McHitarian

Birden çok iş parçacığı çalışan bir uygulama var. Bazı durumlarda, uygulamadan çıkmadan önce Thread.Abort () ile bazı konuları tıkamam gerekiyor. Bu durumlarda int Main () {... thread.Abort (); ... return 0;} işlem çıkış kodu 0 ile sonuçlanmaz: işlem çıkış kodu -1'dir. Bazı durumlarda, MS, sürecin çıkış kodunu ayarlamak için ana iş parçacığının dönüş değerini kullanma sözleşmesinin onlar için yeterince iyi olmadığına karar vermiştir. Adil olmak gerekirse, bu bir zamanlama sorunu olabilir: iş parçacığı iptali, çıkış kodunu oyunda çok geç ayarlıyor olabilir.
David I. McIntosh

7

Numaralandırma seçeneği mükemmeldir ancak sayılar aşağıdaki gibi çarpılarak geliştirilebilir:

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

Birden fazla hata olması durumunda, belirli hata numaralarını bir araya getirmek size tespit edilen hataların kombinasyonunu temsil edecek benzersiz bir numara verecektir.

Örneğin, 6 hata seviyesi yalnızca 4 ve 2 hatalarından oluşabilir, 12 yalnızca 4 ve 8 hatalarından oluşabilir, 14 yalnızca 2, 4 ve 8 hatalarından oluşabilir.


2
Ancak, bir karşılaşma ile karşılaştıktan sonra başka hataları kontrol etmek için rahatsız ediyorsanız. Çoğu uygulama bunu yapmaz.
Nyerguds


0

Bu kodu kullan

Environment.Exit(0);

hiçbir şey döndürmek istemiyorsanız int olarak 0 kullanın.


Bu OP'nin sorusunu cevaplamıyor ve 0'a dönmek bir şey döndürüyor ...
PL
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.