在发布模式下Console.SetOut出现问题?

时间:2010-04-15 14:59:24

标签: c# .net c

我的代码中有一堆Console.WriteLines,我可以在运行时观察到。我与我也写过的本地图书馆进行了沟通。

我想在本地库中粘贴一些printf并观察它们。但是我没有在运行时看到它们。

我创建了一个令人费解的hello world应用程序来演示我的问题。当应用程序运行时,我可以调试到本机库并看到调用hello world。输出永远不会落在文本作者身上。请注意,如果相同的代码作为控制台应用程序运行,那么一切正常。

C#:

    [DllImport("native.dll")]
    static extern void Test();

    StreamWriter writer;

    public Form1()
    {
        InitializeComponent();

        writer = new StreamWriter(@"c:\output.txt");
        writer.AutoFlush = true;
        System.Console.SetOut(writer);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Test();
    }

和原生部分:

__declspec(dllexport) void Test()
{
    printf("Hello World");
}

更新: 下面的hamishmcn开始讨论调试/发布版本。我在上面的button1_click方法中删除了原生调用,并将其替换为标准的Console.WriteLine .net调用。当我在调试模式下编译并运行它时,消息被重定向到输出文件。当我切换到释放模式时,呼叫没有被重定向。控制台重定向似乎只在调试模式下工作。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

由于某些原因,也许您的本地图书馆不了解控制台 您可以尝试调用GetConsole并查看是否返回句柄。如果不是,您可以尝试分配自己的console,看看是否有效 祝好运! :-)


更新:
我也编写了一个示例应用程序(控制台C#app调用本机C ++ DLL),C#Console.WriteLine和本机printf都出现在控制台上......那么我们缺少什么?
你总是在调试模式下运行 - 如果你在发布模式下运行它,你会看到一个控制台窗口吗? 更新2:
对不起,我应该说我在控制台上看到了文本,但是如果我将Console输出设置为StreamWriter,就像你的示例中那样,那么只有WriteConsole文本转到输出文件,printf仍然是转到屏幕

答案 1 :(得分:1)

我目前没有任何可以试用的项目,但我肯定会怀疑缓冲。如果我的记忆对我有用,stdout会被缓冲。它每次到达行尾时都会刷新缓冲区:

printf("Should be flushed immediatelly\n");

或者您可以使用fflush来刷新stdout

printf("Will be buffered and then flushed");
fflush(stdout);

您还可以使用setbuf

关闭缓冲
setbuf(stdout, NULL);

答案 2 :(得分:1)

控制台重定向仅适用于调试模式。

答案 3 :(得分:0)

实现自己的printf(在vsnprintf之上,以处理脏的细节)写入控制台:

#include <stdarg.h>

int printf(const char *fmt, ...)
{
    char buffer[LARGESIZE];
    int rv;
    va_list ap;
    va_start(ap, fmt);
    rv = vsnprintf(buffer, sizeof(buffer), fmt, ap);
    va_end(ap);

    Console.WriteLine(buffer);

    return rv;
}