2016-06-10 35 views
6

Çalıştırmak için windows görev zamanlayıcısı için bir konsol programı yazıyorum. Benim Main() yönteminde bir int dönüş türü vardır ve ben bir .BAT komut dosyasında %errorlevel% olarak erişebileceğim yürütme sonucunu göstermek için çıkarken farklı sayılar döndürüyorum. VS2015 içinde ayıklarkenC# konsol uygulaması: Ana yöntem dönüş değeri VS Application.ExitCode

Ancak, ben bir

return 255; 

yapmak ve her zaman VS2015 Çıktı penceresinden olsun: Ben çıkış kodunu görüntülemek için Çıktı penceresini istiyorsanız Şimdi

The program '[43560] Foo.vshost.exe' has exited with code 0 (0x0). 

programımın ben ne garip

The program '[24400] Foo.vshost.exe' has exited with code 255 (0xff). 

göstermek için Application.Exit(255) yapmak zorunda CMD.exe programında doğruysa, döndürme deyimi veya Environment.Exit() ile çalıştırılır.

Benim soru

  1. Environment.ExitCode için biraz farklı Main() dönüş değeri var mı?

  2. VS2015'te Main() yönteminin dönüş değerini kolayca bulmanın yolu nedir?

  3. Bir konsol programından çıkarken, basit bir iade ifadesinden Environment.Exit() tercih edilir mi? Çünkü bir iade ifadesi benim zevkime daha açık.

Birisi bana bunun öyküsünü anlatır mı? Teşekkürler.

cevap

6

Main() ortamının dönüş değeri, Environment.ExitCode'dan biraz farklı mıdır?

Hayır, aynıdır ve aynı yere giderler. Bunu, -1 değerini döndüren veya Environment.ExitCode değerini -1'e ayarlayan bir konsol uygulaması ile deneme yaparak görebilirsiniz. Hangi yöntemi kullanırsanız kullanın ve %ERRORLEVEL% doğru şekilde ayarlar.

VS2015'deki Main() yönteminin dönüş değerini kolayca bulmanın yolu nedir?

İlk olarak, neler olduğuyla ilgili hızlı bir kenara. İşte varsayılan proje ayarları kullanılarak oluşturulan bir konsol uygulaması için yığın izleme: VS konak süreç var

TestApp.exe!TestApp.Program.Main(string[] args) 
[Native to Managed Transition] 
[Managed to Native Transition] 
mscorlib.dll!System.AppDomain.ExecuteAssembly(string assemblyFile, System.Security.Policy.Evidence assemblySecurity, string[] args) 
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) 
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) 
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) 
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() 

Bildirim söyledi.(Aynı seçeneklerle) yığın izini devre VS barındırma işlemiyle şuna benzer:

TestApp.exe!TestApp.Program.Main(string[] args) 

Eğer reference source içinde ThreadHelper.ThreadStart tanımına bakacak olursak bunu olarak tanımlanan görürsünüz:

internal void ThreadStart(object obj) 

Bu boşluk geri dönüşü, işlem geri dönüş değeri olarak kullanılıyor ya da üstündeki diğer yöntemlerden biri, dönüş değerini tüketiyor ve yutuyor.

proje yapılandırmasını değiştirmek ve barındırma işlemini devre dışı bırakırsanız o zaman çıkış gibi alacak:

The program '[7992] TestApp.exe' has exited with code -1 (0xffffffff). 

beklediğiniz gibi. barındırma işlemini devre dışı bırakmak için, proje özelliklerine gidin ve bir konsol programı çıkarken ayıklama sekmesinde, "Enable Visual Studio barındıran süreci"

işaretini kaldırın Environment.Exit() basit daha tercih edilir dönüş beyanı? Çünkü bir iade ifadesi benim zevkime daha açık. Hangisini tercih ederseniz edin.

Jeppe Stig tarafından bir yorumda belirtildiği gibi, farklılıklar hakkında daha fazla bilgi için, Environment.Exit

+0

belgelerine bakın. Ayrıca bkz. [The Environment.Exit (Int32) 'yöntem belgeleri] (https://msdn.microsoft.com /en-us/library/system.environment.exit.aspx) farklılıklar listesi için. –

+0

@JeppeStigNielsen İyi nokta. Yorumunuzun kaybolması durumunda bunun hakkında bir not eklendi. – theB

+2

* Ana kaynaktan dönerek çıkmak için * tercih edin. 'Environment.Exit' çağırmak bir korsanlıktır ve iyi tasarlanmış bir uygulamada gerekli olmamalıdır. –

İlgili konular