AttachConsole(-1), aber die Konsole.WriteLine wird nicht ausgegeben zu übergeordneten Eingabeaufforderung?
Wenn ich mein Programm in eine Windows Application
, und verwendet die AttachConsole(-1)
API, wie bekomme ich Console.WriteLine
schreiben in die Konsole startete ich die Anwendung aus? Es ist nicht für mich arbeiten.
Falls es relevant ist, ich verwende Windows 7 x64 und ich habe die UAC aktiviert. Erhöhung scheint nicht das problem zu lösen, obwohl, noch mit start /wait
.
Update
Zusätzliche Hintergrundinformationen, die helfen könnten:
Ich habe gerade entdeckt, dass wenn ich gehe in die Eingabeaufforderung, und geben Sie cmd /c MyProgram.exe
, Dann die Ausgabe in der Konsole funktioniert. Das gleiche gilt, wenn ich starten Sie eine Eingabeaufforderung, öffnen Sie ein cmd.exe
sub-Prozess, und führen Sie das Programm aus, dass die sub-shell.
Ich hab auch versucht abzumelden und wieder an, läuft von einer cmd.exe gestartet aus dem Menü start (im Gegensatz zu rechts-klicken -> Eingabeaufforderung), und läuft von ein console2 Instanz. Keiner von denen funktioniert.
Hintergrund
Ich hab auf anderen Seiten gelesen und in mehrere SO Antworten, dass ich anrufen kann die win32-API AttachConsole
zu binden, mein Windows-Anwendung auf der Konsole, lief mein Programm, also ich kann etwas haben, das "sowohl eine Konsole-Anwendung und einer Windows-Anwendung".
Beispielsweise diese Frage: Ist es möglich eine log-Meldung zu cmd.exe in C#/.Net?.
Ich habe geschrieben, eine Reihe von Logik, um diese Arbeit zu machen (mit einigen anderen APIs), und ich habe jedem anderen Szenario funktioniert (einschließlich Umleitung, die anderen haben behauptet, wird nicht funktionieren). Das einzige Szenario ist, um Console.WriteLine
schreiben in die Konsole startete ich mein Programm mit. Von allem, was ich gelesen habe soll dies funktionieren, wenn ich AttachConsole
.
Repro
Hier ein minimal-Beispiel - Beachten Sie, dass das Projekt ist auf eine Windows Application
:
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Forms;
class Program
{
[STAThread]
static void Main(string[] args)
{
if (!AttachConsole(-1))
{
MessageBox.Show(
new Win32Exception(Marshal.GetLastWin32Error())
.ToString()
);
}
Console.WriteLine("Test");
}
[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
private static extern bool AttachConsole(int processId);
}
- Wenn ich dieses aus einer Eingabeaufforderung, die ich nicht erhalte eine Fehlermeldung, aber ich bekomme keine Ausgabe in der Konsole entweder. Das ist das problem
- Wenn ich extra message Boxen überall in der ausführungsablauf der app, die message-box angezeigt bekommt. Ich erwarte, dass dies, also alles gut hier.
- Wenn ich dieses von Visual Studio oder durch einen Doppelklick auf Sie, wird eine message-box mit einer Fehlermeldung angezeigt. Ich erwarte, dass diese, also keine Sorge hier (will
AllocConsole
in meiner realen app).
Wenn ich den Anruf Marshal.GetLastWin32Error
nach dem Aufruf Console.WriteLine
bekomme ich den Fehler "System.ComponentModel.Win32Exception (0x80004005): Das handle ist ungültig". Ich vermute, dass das anbringen an der Konsole verursacht Console.Out
Gerät Durcheinander, aber ich bin mir nicht sicher, wie es zu lösen ist.
- Warum nicht, Sie markieren Ihr Programm als console-Anwendung?
- Sehr seltsam ... ich benutze auch
AttachConsole(-1)
in einer Anwendung und es funktioniert ohne Problem. Ich werde vergleichen Sie den code, wenn ich in die Arbeit und nach zurück, wenn es keinen Unterschied. @CodeInChoas: Wenn Sie es schaffen, als eine Konsole-Anwendung, haben Sie immer das Konsolenfenster im hintergrund. Durch die Verwendung AttachConsole Sie bekommen das beste von beiden - eine Anwendung, die beim öffnen über die Eingabeaufforderung (Konsole) schreibt er auf die Konsole streamt. - Das scheint die "well, duh!" - Lösung 🙂 Aber ich weiß nicht wirklich wollen, "sowohl eine Konsole-und Windows-app", ich möchte entweder eine Konsole oder Windows-app, basierend auf Befehlszeilen-switches. Und ich will nicht die Konsole zu blinken aus dem Bildschirm, wenn ich starten Sie es. Dies ist ein ziemlich häufiges Szenario, und ich habe über ein Dutzend threads, um alles zu arbeiten, darunter dieses Stück. Außer, dass dieses Stück nicht funktioniert. Wenn Sie denken, ich sollte meine Anforderungen mehr klar in meiner Frage, lassen Sie mich wissen, und ich werde gerne es beheben.
- Sie müssen entweder eine Konsolenanwendung oder einer windows-app. Sie beschließen, dass die beim erstellen der EXE-Datei. Windows behandelt Sie anders. Der beste Ansatz ist, erstellen Sie eine Windows-app, die dann zur Laufzeit entscheiden, ob Sie zum anzeigen des Formulars. AttachConsole nur ermöglicht, eine windows-Anwendung zu schreiben, auf eine Konsole.
- Außer, dass
AttachConsole
nicht erlauben, das Fenster zum schreiben einer Konsole. Das ist genau der Teil, den ich versuche, zu arbeiten. - Ich weiß nicht, riecht Umwelt. Was Sie zu tun versuchen, ist grundsätzlich fehlerhaft ist, obwohl, es gibt ein Rennen zwischen cmd.exe schreiben Sie die Konsole-Fenster (Anzeige der Eingabeaufforderung) und Ihr Programm schreiben "Test". Zumindest schreiben mehr als 4 Zeichen. Das Rennen ansonsten ziemlich viel Ruinen der Idee.
- Da jeder andere sagt, es sollte funktionieren, ja es riecht Umwelt. Obwohl, wenn jemand eine Idee hat, kurz der Abflachung meiner box, das wäre schön 🙂 ich denke, der Fehler hier ist, dass ich nicht deutlich gemacht, dass ich nicht erwarten Perfektion. Ich erwarte nicht, dass mein Programm zum sperren der Konsole beim starten von der Konsole (es sei denn ich nutze den work-around
start /wait
, wie die Leute in anderen threads vorgeschlagen). Aber ich erwarte, dass ich sollte in der Lage sein, um die Ausgabe in der Konsole wenn ich legen Sie es, nur eben nicht ausschließlich. Meinst du die Rasse kann dazu führen, dass mein Anschluss oder Ausgang zu scheitern? Oder einfach nur schlecht Aussehen? - Das problem mit
AttachConsole(-1)
ist, dass es nicht geben Ihnen eine normale Konsolenanwendung. Eine normale Konsolenanwendung blockiert die Konsole,AttachConsole(-1)
nicht. Es scheint unmöglich zu sein, zu einem einzigen Programm, das sowohl gut benommen Konsolen-und gui-Anwendung. - Das ist richtig. Sie sollte nur mit
AttachConsole(-1)
wo Sie wollen, schreiben Sie an die Konsole an, wenn Sie eine Windows-Anwendung. Wenn die OP-Anforderungen unterschiedlich sind (die auf die zweite Lesung der sample-code zu sein scheint), dann ist ein weiterer Ansatz, die berücksichtigt werden muss. - Gut ich werde die Höhle, um peer-Druck. Die Sache wird ein Konsole-Anwendung im wirklichen Leben. Wenn Sie Jungs sind, das hat funktioniert, bis über es, ich bin sicher, dass andere devs werden auch wenn ich diese Lösung auf NUnit-DLLs, die Sie gerade arbeiten. Ich bin immer noch interessiert, warum
AttachConsole
nicht funktioniert, wenn es scheint zu funktionieren für alle anderen. Wenn jemand kann mir eine Antwort... - waren Sie in der Lage, dieses Problem zu beheben? Ich bin vor dem gleichen problem, AttackConsole, AllocConsole nichts arbeiten.
- Keine Ahnung; ich gab vor einer Weile. Sehen, ob diese Antwort hilft - stackoverflow.com/a/14470419/232593 - wenn es klappt, lass es mich wissen und ich werde es akzeptieren.
- Für alle, die dies Lesen, ich fand, dass stackoverflow.com/a/14470419/232593 hat in der Tat den richtigen Grund.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, wie ich es in Winforms. Mit WPF wäre ähnlich.
App.exe someargs
), und kein text ausgegeben wird. Wenn ichcmd /c App.exe someargs
obwohl, es scheint zu funktionieren (?!?)/t:winexe
oder/t:exe
? Sie weisen unterschiedliche Verhalten, aber die beiden "arbeiten" für mich.Hatte das gleiche problem und es scheint, dass bei der Ausführung
cmd.exe
im Administrator-ModusAttachConsole()
Aufruf ist erfolgreich, aberConsole.Write()
undConsole.WriteLine()
funktionieren nicht. Wenn Siecmd.exe
normal (nicht-admin) scheint alles gut zu funktionieren.AttachConsole(-1)
gelingt aberConsole.WriteLine()
geht nirgendwo. Ausgeführt wird die Anwendung von nicht-Eingabeaufforderung zeigt die Ausgabe. Also bei einigen level-Fenster ist zu entscheiden, dass die app wird nicht erlaubt, um tatsächlich schreiben Sie in einer geerbten erhöhten Konsole.Hatte das gleiche problem. Es hat alles Super geklappt, wenn ich ins Leben gerufen, die gebaut .exe-Datei, aber nicht um die Ausführung innerhalb des VS.
Lösung:
Vielleicht hilft es anderen Menschen, um dieses Problem zu beheben.
Kann ich nicht sehen alle signifikanten Unterschied zwischen unserer Implementierungen. Für was es Wert ist, unten ist das, was ich in meiner Anwendung, und es funktioniert gut. Außerdem erstelle ich eine WPF-Beispielanwendung und es auch gut geklappt hat.
Ich vermute, dass dein Problem woanders liegt. Sorry, ich konnte nicht mehr helfen.
AllocConsole
wie gezeigt in @Cheeso Antwort.AllocConsole
alle am arbeiten. Ich werde dir über die richtige Passform-problem (was alle anderen scheint zu sein, sich Gedanken über für mich, lol). Ich bin fein mit schlechtem Verhalten hier, und ich bin nicht die Vorlage Kunden, also keine Sorge. Unter Berücksichtigung aller push back ich bin geting obwohl, vielleicht sollte ich das verflixte Ding eine Konsolenanwendung und nennen Sie es getan tho. Aber es ist wirklich gräbt mich an, wenn es eine Lösung für jeder sagt, sollte funktionieren, und es funktioniert nicht für mich 🙂Ich hatte eine ähnliche situation: konnte nicht Holen Sie sich eine Windows-Anwendung zur Ausgabe alles, was in der programmgesteuert angeschlossenen Konsole. Schließlich stellte sich heraus, dass ich war das verwenden der Konsole.WriteLine einmal vor AttachConsole, und das war die Manipulation mit allem, was folgte.
+1
Ich hatte das gleiche problem. Die Ausgabe der Konsole würde nicht zeigen, bis mit verschiedenen Geschmacksrichtungen von
AllocConsole
oderAttachConsole
.Aktivieren, wenn Sie deaktiviert haben Aktivieren Sie die visual studio-Hostprozess in Ihrem Projekt-Konfiguration. Aktivieren Sie diese option, magisch gemacht, alle Nachrichten auf der Konsole angezeigt, wie erwartet für mich. Ich bin mit VS2010 und .NET4, aber dieser Beitrag schlägt vor, das 'feature' ist immer noch da in VS2012.
Ich litt unter dem gleichen problem mit meiner Anwendung die aktuelle version (targeting .NET 4.0), bin aber sicher, dass
AttachConsole(-1)
hat funktioniert, wie erwartet, in früheren Versionen (die gezielte .NET 2.0).Fand ich, dass ich bekommen konnte die Ausgabe in der Konsole, sobald ich entfernte mein (custom) TraceListener aus meiner Anwendung .exe.config-Datei, auch wenn ich nicht weiß warum noch.
Vielleicht ist das, was schlucken Sie Ihre Ausgabe in der Konsole als auch...
Update
In der Tat hatte ich einen
Console.WriteLine()
in meiner benutzerdefinierten Ablaufverfolgungs-listener 's c' Tor, die Durcheinander Dinge. Nach dem entfernen dieser Zeile die Ausgabe der Konsole nachAttachConsole(-1)
ging zurück zu normal.DETACHED_PROCESS und CREATE_NEW_CONSOLE
ist das problem hier.sehen https://stackoverflow.com/a/494000/883015
Gleiche problem hier. Ich war mit
gflags.exe
, (Teil Debugging Tools für Windows) zu befestigen, ein commandline-WPF-Anwendung, dievsjitdebugger.exe
(Siehe diese post). Solange mein Antrag wurde gepaart mit vsjitdebugger.exe keine Ausgabe in die Konsole geschrieben.Ab dem moment, in dem ich losgelöst meine Anwendung ist, die Ausgabe in der Konsole, von wo aus ich startete meine Bewerbung, wurde restauriert.
Ich hatte ein ähnliches problem. Zusammengesetzte Sachen, ich bin mit WPF w/PRISMA, so muss ich unterdrücken, die Schaffung der 'Shell' wie gut, wenn in "CLI-Modus", aber ich schweife ab...
Dies war die einzige Sache, die ich fand, dass schließlich arbeitete
Alle Anrufe auf die Konsole.WriteLine () - Ausgabe in der CLI-Fenster nach dem Aufruf InitConsole().
Hoffe, das hilft.