【问题标题】:C# capture output from C++ DLLC# 从 C++ DLL 捕获输出
【发布时间】:2019-10-31 22:54:58
【问题描述】:

我有一个 C# Windows 应用程序,它调用 DLL 中的 C++ 函数。 这些 DLL 函数通过printf()std::cout 写入控制台。

当我运行我的 C# 应用程序时,我希望能够看到这个输出,但是我找不到实现它的方法。

我该怎么做?

【问题讨论】:

标签: c# c++ dll


【解决方案1】:

我认为您有一个 .NET Forms 应用程序。如果是这样,您可以简单地为自己分配一个用于标准输出的控制台窗口。

这是一个最小的例子:

// stdout.dll
extern "C" {
  __declspec(dllexport) void __cdecl HelloWorld()
  {
    cout << "Hello World" << endl;
  }
}

将标准处理初始化为零并在程序启动时分配一个新的控制台窗口。

static class Program
{
    [DllImport("kernel32.dll")]
    public static extern bool SetStdHandle(int stdHandle, IntPtr handle);
    [DllImport("kernel32.dll")]
    public static extern bool AllocConsole();
    [DllImport("stdout.dll")]
    extern public static void HelloWorld();

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        SetStdHandle(-10, IntPtr.Zero); // stdin
        SetStdHandle(-11, IntPtr.Zero); // stdou
        SetStdHandle(-12, IntPtr.Zero); // stderr
        AllocConsole();
        /* ... */
    }
 }

在程序流程中调用外部函数:

private void btnHelloWorld_Click(object sender, EventArgs e)
{
    Program.HelloWorld();
}

【讨论】:

  • 通常不是他们使用“捕获”一词时的意思。这样做不需要任何代码,只需 Project > Properties > Application 选项卡,“Output type” = Console。
  • 标题是“捕获”,但内容是:“我想[...] 看到这个输出”。你是对的“输出类型”=>控制台也可以。我喜欢以编程方式进行,但这取决于实际用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 2018-05-15
  • 2015-03-15
  • 2012-05-09
  • 2013-12-23
相关资源
最近更新 更多