C# 从 C++ DLL 捕获输出

标签 c# c++ dll

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

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

我该怎么做?

最佳答案

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

这是一个最小的示例:

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

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

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();
        /* ... */
    }
 }

在程序流程内调用 extern 函数:

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

Hello World Console Window

关于C# 从 C++ DLL 捕获输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58427937/

相关文章:

c# - Auto Patcher(高效的自动更新程序)

c# - 如何比较本地文件和云文件Azure

c++ - C/C++ 中 OpenGL 着色器的简单框架

c# - OpenCV 程序不能在另一台计算机上运行

visual-studio - 在 Visual Studio 中管理构建版本

java - 从小程序重新启动 java.exe

c# - 将 XmlRoot 或 XmlType 与 RestSharp 结合使用

c# - 如何通过调整大小来修复 C# Windows 窗体应用程序的大小

c++ - 如何在eclipse中导入VC++项目?

c# - 在运行时加载 dll 库并在其中运行代码