加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 21:24:18 所属栏目:百科 来源:网络整理
导读:请耐心等待 – 我是一名C#开发人员,对C语言经验不足,这是一个陡峭的学习曲线! 从c#控制台应用程序,我从一个非托管C dll调用一些方法. DLL写入stdout流,尽管c#控制台没有捕获它. 我找到了以下代码,我将其添加到C dll中,它现在成功地将“printf”的内容发送到
请耐心等待 – 我是一名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 );
}

AOK到目前为止:

我想要做的是将stdout从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,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,0 );
}

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

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

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

我不知道如何调试这个!

解决方法

您可以考虑使用命名管道:即

communication between c++ and c# through pipe

http://www.switchonthecode.com/tutorials/interprocess-communication-using-named-pipes-in-csharp

希望,这应该工作……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读