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.

Schreibe einen Kommentar