我想在调试程序时创建一个控制台窗口并在其上打印一些信息。 VS 2010不允许我为我的程序设置不同的输出类型,具体取决于它是处于调试模式还是发布模式,所以我采用手动创建控制台窗口,如下所示:
[DllImport("kernel32.dll")]
public static extern Int32 AllocConsole();
static void Main()
{
#if DEBUG
AllocConsole();
#endif
....
弹出一个控制台窗口,但没有任何内容被写入。我尝试了一堆其他的pinvoke(AttachConsole等......)什么也没做。然后我终于尝试在Visual Studio之外运行应用程序,并且控制台窗口工作。显然Visual Studio正在吃掉我所有的Console.WriteLines!
我该如何解决这个问题?
答案 0 :(得分:5)
遇到同样的问题,这里有一些代码似乎在调用AllocConsole
之后为我恢复控制台输出:
private static void OverrideRedirection()
{
var hOut = GetStdHandle(STD_OUTPUT_HANDLE);
var hRealOut = CreateFile("CONOUT$", GENERIC_READ | GENERIC_WRITE, FileShare.Write, IntPtr.Zero, FileMode.OpenOrCreate, 0, IntPtr.Zero);
if (hRealOut != hOut)
{
SetStdHandle(STD_OUTPUT_HANDLE, hRealOut);
Console.SetOut(new StreamWriter(Console.OpenStandardOutput(), Console.OutputEncoding) { AutoFlush = true });
}
}
P / Invokes如下:
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool SetStdHandle(int nStdHandle, IntPtr hHandle);
public const int STD_OUTPUT_HANDLE = -11;
public const int STD_INPUT_HANDLE = -10;
public const int STD_ERROR_HANDLE = -12;
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr CreateFile([MarshalAs(UnmanagedType.LPTStr)] string filename,
[MarshalAs(UnmanagedType.U4)] uint access,
[MarshalAs(UnmanagedType.U4)] FileShare share,
IntPtr securityAttributes,
[MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
[MarshalAs(UnmanagedType.U4)] FileAttributes flagsAndAttributes,
IntPtr templateFile);
public const uint GENERIC_WRITE = 0x40000000;
public const uint GENERIC_READ = 0x80000000;
答案 1 :(得分:3)
我遇到了同样的问题。只有在托管进程中进行调试时,才能在visual studio中编写控件。转到项目属性 - >调试 - >启用调试器并确保选中“启用Visual Studio主机进程”。
答案 2 :(得分:0)
正如我已经说过here,您可以尝试以管理员身份运行VS 。这对我有用。