我的代码中有一堆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调用。当我在调试模式下编译并运行它时,消息被重定向到输出文件。当我切换到释放模式时,呼叫没有被重定向。控制台重定向似乎只在调试模式下工作。我该如何解决这个问题?
答案 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;
}