簡體   English   中英

在發布模式下Console.SetOut出現問題?

[英]problems with Console.SetOut in Release Mode?

我在我的代碼中有一堆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調用。 當我在調試模式下編譯並運行它時,消息被重定向到輸出文件。 當我切換到釋放模式時,呼叫沒有被重定向。 控制台重定向似乎只在調試模式下工作。 我該如何解決這個問題?

也許您的本地庫由於某種原因不了解控制台。
您可以嘗試調用GetConsole ,看看是否返回了句柄。 如果沒有,你可以嘗試分配自己的控制台 ,看看是否有效。
祝好運! :-)


更新:
我也編寫了一個示例應用程序(控制台C#app調用本機C ++ DLL),並且C#Console.WriteLine和本機printf都出現在控制台上......那么我們缺少什么?
你總是在調試模式下運行它 - 如果你在發布模式下運行它,你會看到一個控制台窗口嗎?
更新2:
對不起,我應該說我在控制台上看到了文本,但如果我將Console輸出設置為StreamWriter,就像你的示例中那樣,那么只有WriteConsole文本轉到輸出文件, printf仍然會進入屏幕

我目前沒有任何可以嘗試的項目,但我肯定會懷疑緩沖。 如果我的記憶對我stdout被緩沖。 它每次到達行尾時都會刷新緩沖區:

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

或者您可以使用fflush刷新stdout

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

您還可以使用setbuf關閉緩沖:

setbuf(stdout, NULL);

控制台重定向僅適用於調試模式。

寫入控制台,實現自己的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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM