【问题标题】:c# pass file pointer to unmanaged c++ dll to use for stdoutc# 将文件指针传递给非托管 c++ dll 以用于标准输出
【发布时间】:2011-11-29 10:34:43
【问题描述】:

请多多包涵 - 我是一名 C# 开发人员,几乎没有 C++ 经验,这是一个陡峭的学习曲线!

从 C# 控制台应用程序,我从非托管 C++ dll 调用一些方法。 DLL 写入标准输出流,尽管 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 运行时会在调试或发布模式下发生,在 VS 外运行时不会崩溃。

我不知道如何调试这个!

【问题讨论】:

  • 项目+属性,调试选项卡,取消托管进程选项。
  • @Hans - 更陌生!我刚刚取消选中它并从 bin 文件夹中删除了相应的文件。该应用程序在 VS 中运行时仍然会崩溃,并且通过双击 BIN 文件夹中的 exe 运行时可以正常运行...知道吗?

标签: c# c++ pointers stdout


【解决方案1】:

【讨论】:

  • 成功了!感谢您的想法和有用的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
相关资源
最近更新 更多