C#, VB.NET: Console anhängen und Debugger-Option "Visual Studio-Hostingprozess aktivieren"

    • Allgemein

    Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

      C#, VB.NET: Console anhängen und Debugger-Option "Visual Studio-Hostingprozess aktivieren"

      Ich hab da einen blöden Effekt entdeckt, reproduziert mit VS2010 und VB2013, in VB und in C#.
      Da das ggf. von allgemeinem Interesse ist, pack ich das zu den Tipps und Tricks rein.
      Folgender einfacher Code:
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Public Class Form1
      2. <DllImport("kernel32", SetLastError:=True)> _
      3. Private Shared Function AllocConsole() As Boolean
      4. End Function
      5. Public Sub New()
      6. AllocConsole()
      7. InitializeComponent()
      8. Console.WriteLine("Konstruktor")
      9. End Sub
      10. End Class

      C#-Quellcode

      1. public partial class Form1 : Form
      2. {
      3. [DllImport("kernel32", SetLastError = true)]
      4. static extern bool AllocConsole();
      5. public Form1()
      6. {
      7. AllocConsole();
      8. InitializeComponent();
      9. Console.WriteLine("Konstruktor");
      10. }
      11. }

      Dies funktioniert im beim Debuggen im Studio nur, so lange diese Checkbox aktiv ist:

      wird sie deaktiviert, bleibt die Console leer.
      Beim Start von der Festplatte, ohne den vsHost-Prozess, funktioniert alles wie gehabt.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!
      Ich hab hier developercommunity.visualstudi…17-works-fine-when-d.html
      folgende unter VS 2017 laufende Lösung gefunden (schon hier gepostet: AllocateConsole() in VB.net(WinForms))
      Eine leere C#-Form, Namnespace anpassen:
      Spoiler anzeigen

      C#-Quellcode

      1. using Microsoft.Win32.SafeHandles;
      2. using System;
      3. using System.IO;
      4. using System.Runtime.InteropServices;
      5. using System.Text;
      6. using System.Windows.Forms;
      7. //https://developercommunity.visualstudio.com/content/problem/12166/console-output-is-gone-in-vs2017-works-fine-when-d.html
      8. namespace AppendConsoleNew
      9. {
      10. public partial class Form1 : Form
      11. {
      12. [DllImport("kernel32.dll", EntryPoint = "AllocConsole", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
      13. private static extern int AllocConsole();
      14. [DllImport("kernel32.dll", SetLastError = true)]
      15. private static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, uint lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, uint hTemplateFile);
      16. private const int MY_CODE_PAGE = 437;
      17. private const uint GENERIC_WRITE = 0x40000000;
      18. private const uint FILE_SHARE_WRITE = 0x2;
      19. private const uint OPEN_EXISTING = 0x3;
      20. public Form1()
      21. {
      22. InitializeComponent();
      23. // Create console.
      24. AllocConsole();
      25. Console.Write("This will NOT show up in the Console window.");
      26. try
      27. {
      28. // Console.OpenStandardOutput eventually calls into GetStdHandle. As per MSDN documentation of GetStdHandle:
      29. // http://msdn.microsoft.com/en-us/library/windows/desktop/ms683231(v=vs.85).aspx will return the redirected handle and not the allocated console:
      30. // "The standard handles of a process may be redirected by a call to SetStdHandle, in which case GetStdHandle returns the redirected handle.
      31. // If the standard handles have been redirected, you can specify the CONIN$ value in a call to the CreateFile function to get a handle to a
      32. // console's input buffer. Similarly, you can specify the CONOUT$ value to get a handle to a console's active screen buffer."
      33. // Get the handle to CONOUT$.
      34. IntPtr stdHandle = CreateFile("CONOUT$", GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
      35. SafeFileHandle safeFileHandle = new SafeFileHandle(stdHandle, true);
      36. FileStream fileStream = new FileStream(safeFileHandle, FileAccess.Write);
      37. Encoding encoding = System.Text.Encoding.GetEncoding(MY_CODE_PAGE);
      38. StreamWriter standardOutput = new StreamWriter(fileStream, encoding);
      39. standardOutput.AutoFlush = true;
      40. Console.SetOut(standardOutput);
      41. Console.WriteLine("This will show up in the Console window.");
      42. Console.WriteLine();
      43. Console.WriteLine("######################");
      44. Console.Out.WriteLine("Out ######################");
      45. }
      46. catch (Exception ex)
      47. {
      48. }
      49. }
      50. }
      51. }
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ () aus folgendem Grund: Code formatiert