2009-07-09 16 views
9

Kiedy opracowuję aplikację konsoli C# (która będzie działać na serwerze) i uruchomię ją za pomocą Visual Studio, otrzymam komunikat "Naciśnij dowolny klawisz, aby kontynuować", zanim program się zakończy.W jaki sposób VS kompiluje aplikacje konsoli, aby wyświetlić "Naciśnij dowolny klawisz, aby kontynuować"?

Jednak, gdy ręcznie skompiluję ten sam plik kodu C# za pomocą CSC, mój program nie wyświetla tego komunikatu i kończy się natychmiast po zakończeniu jego logiki.

Czy ktoś wie, jak mogę zrobić tę samą funkcję podczas kompilowania kodu bez użycia VS i BEZ zmiany kodu C#, dodając ReadLine()?

UPDATE: Ten sam komunikat pojawiał się, gdy dowiedziałem się C#, ja używałem TextPada z CSC, a wiadomość stosować się bez dodawania żadnego zapisu (linia)/Read (Line) powołaniach

+0

Ten [link] (http://stackoverflow.com/q/4834914/944628) działa dla mnie za pomocą klawiszy Ctrl + F5. Używam Visual Studio 2010. – leonardo

Odpowiedz

7

Można napisać skrypt wsadowy, który uruchamia dla ciebie plik EXE i prosi użytkownika o naciśnięcie klawisza.

Skrypt partia będzie wyglądać mniej więcej tak:

echo off 
YourApp.exe 
pause 
+0

Dzięki, program TextPad automatycznie generuje pliki wsadowe. –

+2

Proponuję zamiast tego odpowiedź Chalkeya. –

14

To nie jest możliwe. Monit o naciśnięcie dowolnego klawisza generowany jest przez program Visual Studio podczas uruchamiania aplikacji konsolowej. To nie jest część twojego programu.

Jedynym sposobem jest użycie Console.Read() w kodzie

UPDATE: dotyczy Twoje uwagi na temat korzystania TextPada: Nie jestem zaznajomiony z TextPada, ale nie zdziwiłbym się, gdyby TextPada zrobił to samo, co Visual Studio podczas uruchamiania aplikacji konsolowej.

+0

możesz dodać linię Console.Read() i skomentować ją podczas dostarczania. Jednak najlepszym podejściem, jakie znam, jest używanie rejestrowania i rejestrowanie wszystkich informacji, których potrzebujesz na niższym poziomie, takich jak informacje lub śledzenie lub debugowanie i wyrzucanie ich podczas wysyłki :-) –

+0

Proszę zobaczyć moją aktualizację powyżej. –

+0

OK, dzięki. Jeśli chodzi o twoją aktualizację, jak wspomniałem w moim komentarzu do odpowiedzi Andrew, TextPad automatycznie generuje pliki wsadowe, aby to osiągnąć. –

2

Takie zachowanie nie ma nic wspólnego z kompilatora używasz. Podczas kompilacji z Visual Studio, uruchamianie pliku wykonywalnego poza programem Visual Studio faktycznie będzie wykonywać dokładnie to samo, co podczas kompilowania z CSC w wierszu poleceń. Visual Studio (i TextPad) dodaje logikę, aby dodać komunikat "Naciśnij dowolny klawisz, aby kontynuować" na konsoli.

Jeśli chcesz, aby aplikacja pozostała otwarta, musisz wykonać coś takiego jak Console.ReadLine() w celu zablokowania wykonania, aby aplikacja nie zakończyła jego wykonywania.

22

To nie ma nic wspólnego z kompilatora - po naciśnięciu F5 debugować go zamiast Ctrl-F5 uruchomić bez debugowania, a następnie VS nie wyświetla monit. Jest to prawdopodobnie tak, że nie przegapisz żadnego wyjścia, które produkuje.

W tym celu, Visual Studio uruchamia cmd.exe informując go, aby uruchomić plik wykonywalny, a następnie wstrzymać:

"C:\WINDOWS\system32\cmd.exe" /c ""...\ConsoleApplication1.exe" & pause" 

Prawdopodobnie nie robi tego podczas debugowania jak to trochę trudniej dostać identyfikator procesu dziecka procesu potomnego.

Aby dodać podobną opcję do swojego programu, użyj przełącznika wiersza poleceń, aby powiadomić samą aplikację, aby wstrzymała, lub użyj pliku wsadowego, aby go uruchomić, a następnie wstrzymaj, lub użyj skrótu z nimi cmd.exe /c.

8

Możesz zrobić to ...

static void Main(string[] args) 
{ 
#if DEBUG 
    Console.Read(); 
#endif 
} 

W ten sposób program nie będzie czekać na wejście konsoli podczas budowania aplikacji jako "Release".

+0

Naoooo, spowoduje to rozłączenie się, chyba że ktoś pomyśli o dodaniu kilku sygnałów wejściowych przed uruchomieniem skryptu. na przykład 'echo y | script.exe, aby zachować elastyczność, znacznie lepiej jest zatrzymać pauzę poza programem. –

1

Pytanie brzmi, dlaczego chcesz zachować takie zachowanie? Naciśnięcie dowolnego klawisza, aby kontynuować funkcję, umożliwia wyświetlenie danych wyjściowych aplikacji. Jeśli z drugiej strony skompilujesz swój kod i uruchomisz go z wiersza poleceń (konsoli), nie zamknie się on po zakończeniu aplikacji, więc możesz zobaczyć wynik.

Jak wspomniano powyżej, naciśnięcie dowolnego klawisza, aby kontynuować, jest funkcją IDE i nie jest związane z pisanym kodem. Celem tej funkcji jest umożliwienie wyświetlenia wyniku działania aplikacji konsolowej.

2

Możesz to zrobić, jeśli chcesz korzystać z tej samej funkcjonalności podczas debugowania.

if (Debugger.IsAttached) 
{ 
    Console.WriteLine("Press any key to continue . . ."); 
    Console.ReadKey(true); 
} 
+0

, który nie respektuje ani c14n ani i11n. –

+0

Nie ma sposobu, aby wykonać i11n na tym, ponieważ ciągi zasobów, używane przez Visual Studio, nie są łatwo dostępne. Naprawdę nie jestem pewien, co masz na myśli z c14n, nie wydaje się to istotne dla zadawanego pytania. – Siewers

+0

Nie jest kanoniczny (c14n), ponieważ odtwarza się funkcję, która już istnieje (pauza). ale nie upadłem, ponieważ sam też używam tej techniki. Czasami po prostu nie chcemy dbać o gówno. Jeśli to wystarczy. –

Powiązane problemy