ฉันจะระบุรหัสทางออกของแอปพลิเคชันคอนโซลใน. NET ได้อย่างไร


471

ฉันมีแอปพลิเคชั่นคอนโซลเล็กน้อยใน. NET มันเป็นเพียงส่วนหนึ่งในการทดสอบของแอปพลิเคชันขนาดใหญ่ ฉันต้องการระบุ "รหัสทางออก" ของแอปพลิเคชันคอนโซลของฉัน ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


599

3 ตัวเลือก:

  • คุณสามารถกลับมาได้จากMainถ้าคุณประกาศของคุณวิธีการที่จะกลับมาMainint
  • Environment.Exit(code)คุณสามารถโทรหา
  • Environment.ExitCode = -1;คุณสามารถตั้งค่ารหัสทางออกโดยใช้คุณสมบัติ: สิ่งนี้จะถูกนำมาใช้หากไม่มีสิ่งใดกำหนดรหัสส่งคืนหรือใช้หนึ่งในตัวเลือกอื่นด้านบน)

สามารถใช้วิธีการต่าง ๆ ได้ทั้งนี้ขึ้นอยู่กับแอปพลิเคชันของคุณ (คอนโซลบริการเว็บแอป ฯลฯ )


12
สำหรับผู้ที่สงสัยว่าเหตุใดจึงไม่ทำงานในกรณีของพวกเขาตรวจสอบให้แน่ใจว่าโครงการของคุณได้รับการคอมไพล์เป็น "แอปพลิเคชันคอนโซล" และไม่เป็น "แอปพลิเคชัน Windows"
Marcel Gosselin

9
ถ้าฉันมีแอพ WinForms ที่มีบางอันฉันต้องการให้มันทำงานเป็นแอพคอนโซล
sebagomez

5
คุณยังสามารถพิมพ์โปรแกรม maine เป็น int (แทนที่ void ด้วย int) และใช้เช่น "return -1;" เพื่อกลับจากโปรแกรมหลัก นี่เป็นแบบพกพามากกว่า Environment.Exit () (ขึ้นอยู่กับสภาพแวดล้อม)
เนอร์

14
@DannyBeckett จากการประชุมรหัสทางออกของ0ความสำเร็จหมายถึงและความล้มเหลวที่ไม่เป็นศูนย์หมายถึง return;บ่งชี้ความสำเร็จผ่านรหัสทางออก0และreturn -1;บ่งชี้ความล้มเหลว
allonhadaya

6
คุณยังสามารถตั้งรหัสออกได้โดยใช้คุณสมบัติ: Environment.ExitCode = -1;
t3b4n

270

นอกจากคำตอบที่ครอบคลุมการกลับมาของ ... ข้ออ้างเพื่อสติ กรุณาโปรดกำหนดรหัสออกของคุณใน enum ด้วยค่าสถานะถ้าเหมาะสม มันทำให้การดีบักและบำรุงรักษาง่ายขึ้นมาก (และเป็นโบนัสคุณสามารถพิมพ์รหัสทางออกบนหน้าจอความช่วยเหลือของคุณ - คุณมีหนึ่งในนั้นใช่ไหม?)

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

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

46
คุณอาจต้องการเพิ่มว่าค่าของ "0" สำหรับ "ความสำเร็จ" ไม่ใช่โดยบังเอิญ แต่จริงๆแล้วค่า "มาตรฐาน" สำหรับสถานการณ์นั้น
Christian.K

39
นี้. นี่คือเหตุผลว่าทำไม SO เป็นเว็บไซต์ที่ยิ่งใหญ่ที่สุดในประวัติศาสตร์ของอินเทอร์เน็ต คำแนะนำนี้ไม่พร้อมใช้งานในตำราเรียนใด ๆ และสามารถรวบรวมได้โดยการพูดคุยกับมืออาชีพที่มีประสบการณ์ ขอบคุณ.
Daniel Szabo

17
คุณบอกว่า 0 เป็นค่ามาตรฐานสำหรับความสำเร็จและเมื่อแปลง 0/1 เป็นบูลีน 0 จะเป็นเท็จและ 1 เป็นจริง! มันอาจจะแม่นยำมากกว่าที่จะบอกว่ารหัสทางออก 0 หมายถึง "ไม่มีข้อผิดพลาด" แทนที่จะเป็น "ความสำเร็จ" เนื่องจากรหัสทางออกคือ ErrorResult ไม่ใช่เพียงผลลัพธ์
Mark Shapiro

11
สำหรับรายการที่สมบูรณ์ของการประชุม Microsoft, ดูmsdn.microsoft.com/en-us/library/windows/desktop/... ผู้ชายบางคนทำรายการ const จำนวนมากและใช้มันในกล่องสวิตช์เพื่อแสดงความคิดเห็นเพิ่มเติมด้านล่าง
nawfal

5
@ MarkShapiro ฉันเดา0 = Successมาจากความจริงที่ว่ามีรหัสความสำเร็จเพียงอย่างเดียวที่จำเป็น แต่รหัสข้อผิดพลาดหลายอย่างเช่น 0 ซึ่งไม่มี + หรือ - ในจำนวนเต็มคอมพิวเตอร์สามารถใช้เพื่อระบุความสำเร็จโดยเฉพาะ
Sebastian

49

มีสามวิธีที่คุณสามารถใช้เพื่อส่งคืนรหัสออกจากแอปพลิเคชันคอนโซล

  1. ปรับเปลี่ยนMainวิธีการในแอปพลิเคชันของคุณเพื่อให้ส่งคืนการintแทนที่void(ฟังก์ชันที่ส่งกลับการIntegerแทนที่Subใน VB.Net) แล้วส่งคืนรหัสออกจากวิธีการนั้น
  2. ตั้งค่าคุณสมบัติEnvironment.ExitCodeเป็นรหัสออก โปรดสังเกตว่าวิธีที่ 1 จะมาก่อน - หากMainวิธีการส่งคืนสิ่งอื่นที่ไม่ใช่void(เป็น a Subใน VB.Net) ดังนั้นค่าของคุณสมบัตินี้จะถูกละเว้น
  3. ส่งรหัสออกไปยังวิธีการEnvironment.Exit การดำเนินการนี้จะยุติกระบวนการทันทีซึ่งตรงข้ามกับอีกสองวิธี

มาตรฐานที่สำคัญที่ควรสังเกตคือ0'ความสำเร็จ'

ในหัวข้อที่เกี่ยวข้องให้พิจารณาใช้การแจงนับเพื่อกำหนดรหัสออกที่แอปพลิเคชันของคุณจะกลับมา FlagsAttributeจะช่วยให้คุณกลับมารวมกันของรหัส

ตรวจสอบให้แน่ใจว่าแอปพลิเคชันของคุณรวบรวมเป็น 'แอปพลิเคชันคอนโซล'


1
นี่เป็นจุดที่น่าสนใจ การตั้งค่าEnvironment.ExitCodeไม่ปิดโปรแกรมทันที แต่Environment.Exitวิธีปิดโปรแกรมทันที
PsychoData

1
รหัสการออกยังสามารถใช้งานได้กับแอปพลิเคชัน windows หากแอปเริ่มต้นจาก c # ผ่านทางProcessวัตถุคุณสามารถขอให้วัตถุWaitForExit()นั้นแล้วขอรหัสออกจากมันได้
Nyerguds

43

หากคุณจะใช้วิธีที่ David แนะนำคุณควรดูที่ [Flags] Attribute

สิ่งนี้ช่วยให้คุณสามารถดำเนินการกับบิตได้อย่างชาญฉลาด

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

แล้วก็

(ExitCodes.SignFailed | ExitCodes.UnknownError)

น่าจะเป็น 16 +32 :)


3
นี่ก็หมายความว่าโปรแกรมจะบอกว่า 'รหัสผ่านของคุณไม่ถูกต้อง' จากนั้นไปลองและลงนามในสิ่งที่มันกำลังเซ็นชื่อและหยุดถ้ามันล้มเหลวเท่านั้น คุณควรกลับมาเมื่อคุณล้มเหลว สิ่งอื่นใดคือคำเตือนและโปรแกรมควรกลับมาเป็น 0
Pete Kirkham

3
ความจริงที่รู้จักกันน้อยคือ [Flags] ไม่ได้ทำอะไรเพื่อเปิดใช้งานหรือปิดใช้งานการทำงานระดับบิต สิ่งที่มันทำคือแทนที่เมธอด ToString เพื่อให้เอาท์พุทแทนค่าสถานะ bitwise ไม่ว่าคุณจะมีหรือไม่มีก็ตาม
Steven

3
@ สตีเว่นเป็นเรื่องดีที่รู้ แต่ฉันยังคงแนะนำ enums ตกแต่งสำหรับ "การใช้งานธง" กับคุณลักษณะนั้นถ้าไม่มีอะไรอื่นมันบ่งบอกถึงความตั้งใจ
MarioDS

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

17
เหตุผลทางเทคนิคใด ๆ ที่คุณไม่เพียงแค่เขียน "สิ่งแวดล้อมออกจาก (2);" ?
Blorgbeard ออก

52
การกำหนดหมายเลขเวทย์ให้กับตัวแปรที่มีชื่อไร้ความหมายไม่ได้ทำให้มีเวทย์มนตร์น้อยลง
Blorgbeard ออกฉาย


11

เพียงแค่ส่งคืนรหัสที่เหมาะสมจากหลัก

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

2
แอปคอนโซล C # ที่เป็นค่าเริ่มต้นไม่ได้ประกาศหลักเลย มันประกาศ static void Main(string[] args);
Mark Lakata

19
@ Mark Lakta: ถ้าอย่างนั้นเปลี่ยนได้ไหม?
Esteban Araya

11

ใช้ ExitCode หากหลักของคุณมีลายเซ็นคืนเป็นโมฆะมิฉะนั้นคุณต้อง "ตั้งค่า" โดยใช้ค่าที่คุณส่งคืน

คุณสมบัติ Environment.ExitCode

หากวิธีการหลักส่งกลับเป็นโมฆะคุณสามารถใช้คุณสมบัตินี้เพื่อตั้งรหัสออกที่จะกลับสู่สภาพแวดล้อมการโทร ถ้า Main ไม่คืนค่าว่างให้คุณสมบัตินี้จะถูกละเว้น ค่าเริ่มต้นของคุณสมบัตินี้เป็นศูนย์


8

เป็นการอัพเดทคำตอบของ Scott Munro :

  • ใน C # 6.0 และ VB.NET 14.0 (VS 2015) จำเป็นต้องใช้Environment.ExitCodeหรือEnvironment.Exit (exitCode)เพื่อส่งคืนรหัสที่ไม่เป็นศูนย์จากแอปพลิเคชันคอนโซล การเปลี่ยนประเภทผลตอบแทนของMainไม่มีผลกระทบ
  • ใน F # 4.0 (VS 2015) ค่าส่งคืนของmainจุดเข้าใช้งานจะได้รับการเคารพ

จุดแรกของคุณเกี่ยวกับ C # 6 สามารถตรวจสอบได้หรือไม่? ฉันไม่สามารถหาอะไรออนไลน์ได้ ค่าส่งคืนจากฟังก์ชั่นหลักจะแนบกับรหัสทางออกของกระบวนการ (อย่างน้อยในคอมไพเลอร์ก่อนหน้าทั้งหมด) ทำไมพวกเขาควรเปลี่ยนมัน?
Arman McHitarian

หลักฐานเล็ก ๆ น้อย ๆ ที่บริสุทธิ์ แต่ฉันเพิ่งพบเจอสิ่งนี้ในห้องสมุดของฉันเองซึ่งการส่งคืนผลลัพธ์ / รหัสข้อผิดพลาดจากMain()ไม่ได้ตั้งค่าProcess.ExitCodeตามที่เห็นในแอปพลิเคชันการโทร
Marcus Mangelsdorf

MSDN contends int Mainยังคงสามารถใช้เป็นทางเลือกแทน Environment.ExitCode ลิงก์
Arman McHitarian

ฉันมีแอปพลิเคชั่นที่รันหลายเธรด ในบางสถานการณ์ฉันต้องปิดกระทู้บางส่วนผ่าน Thread.Abort () ก่อนออกจากแอปพลิเคชัน ในสถานการณ์เหล่านี้ int Main () {... thread.Abort (); ... return 0;} ไม่ส่งผลให้รหัสออกกระบวนการ 0: รหัสออกกระบวนการคือ -1 ดูเหมือนว่าในบางสถานการณ์ MS ตัดสินใจว่าการใช้ค่าส่งคืนของเธรดหลักในการตั้งค่ารหัสทางออกของกระบวนการไม่ดีพอสำหรับพวกเขา ในความเป็นธรรมอาจเป็นปัญหาเกี่ยวกับเวลา: การยกเลิกเธรดอาจตั้งค่ารหัสออกสายช้ามากในเกม
David I. McIntosh

7

ตัวเลือกการแจงนับนั้นยอดเยี่ยม แต่สามารถปรับปรุงได้โดยการคูณตัวเลขดังใน:

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

ในกรณีที่มีข้อผิดพลาดหลายรายการการเพิ่มหมายเลขข้อผิดพลาดเฉพาะเข้าด้วยกันจะทำให้คุณมีหมายเลขเฉพาะที่จะแสดงการรวมกันของข้อผิดพลาดที่ตรวจพบ

ตัวอย่างเช่นข้อผิดพลาดระดับ 6 สามารถประกอบด้วยข้อผิดพลาด 4 และ 2, 12 เท่านั้นประกอบด้วยข้อผิดพลาด 4 และ 8, 14 เท่านั้นสามารถประกอบด้วย 2, 4 และ 8 เป็นต้น


2
นั่นคือถ้าคุณรำคาญที่จะตรวจสอบข้อผิดพลาดเพิ่มเติมหลังจากพบหนึ่งแม้ว่า แอพส่วนใหญ่ไม่ได้
Nyerguds

3

2 เซนต์ของฉัน:

คุณสามารถค้นหารหัสข้อผิดพลาดของระบบได้ที่นี่: https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx

คุณจะพบรหัสทั่วไปเช่น 2 สำหรับ "file not found" หรือ 5 สำหรับ "access access"

และเมื่อคุณสะดุดกับรหัสที่ไม่รู้จักคุณสามารถใช้คำสั่งนี้เพื่อค้นหาความหมาย:

net helpmsg decimal_code

เช่น

net helpmsg 1

ผลตอบแทน

ฟังก์ชั่นไม่ถูกต้อง


0

ใช้รหัสนี้

Environment.Exit(0);

ใช้ 0 เป็น int ถ้าคุณไม่ต้องการคืนค่าใด ๆ


นี้ไม่ได้รับการตอบคำถามของ OP และกลับมา 0 จะกลับมาบางสิ่งบางอย่าง ...
PL
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.