我使用了一个非常简单的WPF测试应用程序中的Console.WriteLine(),但是当我从命令行执行应用程序时,我没有看到任何东西被写入控制台.有人知道这里发生了什么吗?

我可以通过在VS 2008中创建一个WPF应用程序来复制它,只需在执行它的任何地方添加Console.WriteLine("text")个.有什么 idea 吗?

我现在需要的只是Console.WriteLine()个这样简单的东西.我知道我可以使用log4net或其他一些日志(log)记录解决方案,但这个应用程序真的不需要那么多功能.

Edit:我应该记得Console.WriteLine()是用于控制台应用程序的.哦,没有愚蠢的问题,对吗?:-)

推荐答案

在实际调用任何Console.Write方法之前,您必须手动创建控制台窗口.这将使控制台在不更改项目类型的情况下正常工作(这对于WPF应用程序是不起作用的).

下面是一个完整的源代码示例,介绍ConsoleManager类的外观,以及如何使用它独立于项目类型启用/禁用控制台.

在下面的课程中,你只需要在调用Console.Write之前在某个地方写下ConsoleManager.Show()...

[SuppressUnmanagedCodeSecurity]
public static class ConsoleManager
{
    private const string Kernel32_DllName = "kernel32.dll";

    [DllImport(Kernel32_DllName)]
    private static extern bool AllocConsole();

    [DllImport(Kernel32_DllName)]
    private static extern bool FreeConsole();

    [DllImport(Kernel32_DllName)]
    private static extern IntPtr GetConsoleWindow();

    [DllImport(Kernel32_DllName)]
    private static extern int GetConsoleOutputCP();

    public static bool HasConsole
    {
        get { return GetConsoleWindow() != IntPtr.Zero; }
    }

    /// <summary>
    /// Creates a new console instance if the process is not attached to a console already.
    /// </summary>
    public static void Show()
    {
        //#if DEBUG
        if (!HasConsole)
        {
            AllocConsole();
            InvalidateOutAndError();
        }
        //#endif
    }

    /// <summary>
    /// If the process has a console attached to it, it will be detached and no longer visible. Writing to the System.Console is still possible, but no output will be shown.
    /// </summary>
    public static void Hide()
    {
        //#if DEBUG
        if (HasConsole)
        {
            SetOutAndErrorNull();
            FreeConsole();
        }
        //#endif
    }

    public static void Toggle()
    {
        if (HasConsole)
        {
            Hide();
        }
        else
        {
            Show();
        }
    }

    static void InvalidateOutAndError()
    {
        Type type = typeof(System.Console);

        System.Reflection.FieldInfo _out = type.GetField("_out",
            System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);

        System.Reflection.FieldInfo _error = type.GetField("_error",
            System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);

        System.Reflection.MethodInfo _InitializeStdOutError = type.GetMethod("InitializeStdOutError",
            System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);

        Debug.Assert(_out != null);
        Debug.Assert(_error != null);

        Debug.Assert(_InitializeStdOutError != null);

        _out.SetValue(null, null);
        _error.SetValue(null, null);

        _InitializeStdOutError.Invoke(null, new object[] { true });
    }

    static void SetOutAndErrorNull()
    {
        Console.SetOut(TextWriter.Null);
        Console.SetError(TextWriter.Null);
    }
} 

.net相关问答推荐

SeriLog LogConext.PushProperty在ASP.NET MVC 5中不能使用OWIN中间件

查询 MongoDb 中嵌入式文档中的一个字段,该字段抛出调用运算符的左侧必须是对持久属性的直接访问

是否有任何为 C# 编写的模糊搜索或字符串相似函数库?

Int32.ToString() 是特定于文化的吗?

C# 时间跨度毫秒与 TotalMilliseconds

使用泛型装箱和拆箱

是什么让 Enum.HasFlag 这么慢?

struct 中需要覆盖什么以确保平等正常运行?

为什么 C# 多维数组不实现 IEnumerable

Convert.ToBoolean 和 Boolean.Parse 不接受 0 和 1

解密 .NET clr20r3 异常参数 P1..P10

Visual Studio 2017 和 2019 突出显示滚动条中所选单词的出现

POCO 是什么意思?

无法使用 Unity 将依赖项注入 ASP.NET Web API 控制器

ToLowerInvariant() 有什么问题?

在关闭警告中访问 foreach 变量

无法加载文件或程序集Antlr3.Runtime (1)或其依赖项之一

在 .Net 中调用 Web 服务时绕过无效的 SSL 证书错误

obj 文件夹是为了什么而生成的?

为 webClient.DownloadFile() 设置超时