正在将C++printf重定向到C#

Redirecting C++ printf to C#

本文关键字:重定向 C++printf      更新时间:2023-10-16

我目前有以下设置:

  • 应用程序(可执行文件)
  • C++DLL(包含可执行文件使用的逻辑并加载C#DLL,暂时有一个控制台窗口用于调试)
  • C#DLL(包含GUI)

C#DLL使用一个名为UnmanagedExports的nuget包来向C++提供函数。方法CCD_ 1由C#提供。使用LoadLibrary()加载C#DLL,并且ShowGui()方法正常工作。然而,我似乎很难理解如何实现一个允许C++向C#发送消息的函数。目前,我提出了以下内容:

[DllExport("AddDebug")]
public static void AddDebug([MarshalAs(UnmanagedType.LPStr)]StringBuilder s)
{
    guiMain.AddToTextbox(s.ToString()); // the GUI uses BeginInvoke to prevent cross-thread exceptions.
}

在C++中,我只是简单地将printf()更改为AddDebug(),这似乎只起了一半的作用:在某个时刻,C++DLL在尝试调用AddDebug()时被阻塞,并且没有响应。

我在C++中使用了以下内容进行调试(显然调用sendDebug而不是AddDebug):

sendDebug(string s)
{
    cout << s;
    AddDebug(s);
    cout << s;
}

在C++阻塞的场景中,上面的代码只显示string s一次,C#从不显示。意味着AddDebug()永远不会完成。

我尝试过寻找解决方案,但似乎没有按照我想要的方式工作。更改为完整的C#解决方案不是一个选择,因为C++代码太大了,"转换"需要太多时间。

我希望我的问题很清楚,也许有人建议我不要拔头发。提前谢谢。

最终我实现了一个命名管道。C#是服务器,C++是客户端。似乎工作没有任何问题。