gpt4 book ai didi

c# 将文件指针传递给非托管 c++ dll 以用于标准输出

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:19:39 28 4
gpt4 key购买 nike

请耐心等待 - 我是一名 C# 开发人员,对 C++ 的经验很少,这是一个陡峭的学习曲线!

在 C# 控制台应用程序中,我从非托管 C++ dll 调用一些方法。 DLL 写入 stdout 流,尽管 c# 控制台未拾取它。

我找到了以下代码,我将其添加到 C++ dll 中,现在它成功地将“printf”的内容发送到 C# 控制台。

#include <windows.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>

void redirect_stdout()
{
int hConHandle;
long lStdHandle;
FILE *fp;
// allocate a console for this app
AllocConsole();
// redirect unbuffered STDOUT to the console
lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen( hConHandle, "w" );
*stdout = *fp;
setvbuf( stdout, NULL, _IONBF, 0 );
}

到目前为止还不错:

我想做的是将标准输出从 DLL 捕获到 C# 流,而不是将其发送到控制台。我尝试了此处详述的方法 ( Redirect stdout+stderr on a C# Windows service ),它确实捕获了输出,但是当程序关闭时应用程序“崩溃”(“vshost.exe 已停止工作”)。

(注意:在流上设置 Console.SetOut() 会捕获 c# 输出,而不是 c++ 输出)。

所以我想如果我使用“Filestream.SafeFileHandle.DangerousGetHandle()”方法从 c# 获取文件流的句柄,并将其传递给 C++ 方法 redirect_stdout() 方法会怎样:

void redirect_stdout(FILE *passedInHandle)
{

// allocate a console for this app
AllocConsole();
*stdout= *passedInHandle;
setvbuf( stdout, NULL, _IONBF, 0 );
}

当我运行上述版本时,DLL 的输出不再通过管道传输到 c# 控制台,但是,c# 端的文件流始终为空。

任何专家都可以指导让 STDOUT 将其输出写入 c# 文件流吗?我确信我在如何实现这一点上犯了一些愚蠢的错误,或者我不明白如何实现我想要做的事情。

感谢您的宝贵时间和意见 - 非常感谢!

[编辑]

好的 - 我已经玩了更多并修改了 C++ 方法:

void redirect_stdout(int passedInHandle)
{
int hConHandle;
long lStdHandle;
FILE *fp;
// allocate a console for this app
AllocConsole();

hConHandle = _open_osfhandle(passedInHandle, _O_TEXT);
fp = _fdopen(hConHandle, "w");
*stdout = *fp;
setvbuf( stdout, NULL, _IONBF, 0 );
}

这也成功地填充了 c# 流,但是当 c# 控制台应用程序关闭时,应用程序崩溃并出现错误“vshost.exe 已停止工作”。这与我使用 Redirect stdout+stderr on a C# Windows service 中的方法时的错误相同

非常奇怪的发现:如果我“在 visual studio 之外”运行控制台应用程序(例如,双击 bin 文件夹中的 .exe),没有崩溃!

所以我想我的下一个问题是:如何追踪这次崩溃的根源?与VS有关吗?从 VS 运行时,它会在调试或 Release模式下发生,而在 VS 外部运行时不会崩溃。

我不知道如何调试这个!

最佳答案

关于c# 将文件指针传递给非托管 c++ dll 以用于标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7627152/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com