![](/img/trans.png)
[英]Console.SetOut to StreamWriter, write to textfile constantly
[英]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.