繁体   English   中英

c#将文件指针传递给非托管c ++ dll以用于stdout

[英]c# pass file pointer to unmanaged c++ dll to use for stdout

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

从ac#console app,我正在调用一些来自非托管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 );
}

AOK到目前为止:

我想做的是将stdout从DLL捕获到ac#stream,而不是将其发送到控制台。 我尝试了这里详述的方法( 在C#Windows服务上重定向stdout + stderr ),它捕获输出,但是当程序关闭时应用程序“崩溃”(“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#Console应用程序关闭时,应用程序崩溃时出现错误“vshost.exe已停止工作”。 这与我在C#Windows服务上使用Redirect stdout + stderr中的方法时的错误相同

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

所以我想我的下一个问题是:如何追踪此次崩溃的来源? VS相关吗? 从VS运行时,它在调试或释放模式下发生,在VS外部运行时不会发生崩溃。

我不知道如何调试这个!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM