【问题标题】:Using std::cout in DLL called from C# [duplicate]在从 C# 调用的 DLL 中使用 std::cout [重复]
【发布时间】:2011-05-04 12:48:27
【问题描述】:

我的 Windows 应用程序有一个 C# 部分和一个 C++ 部分。 C# 应用程序在运行时会显示一个控制台窗口。

C++ 代码被编译成一个 DLL,通过 P/Invoke 从 C# 中使用。

问题是通过 std::cout 从 C++ DLL 打印文本不会打印任何内容。从 C# 打印工作正常。

我怀疑 C# 已经接管了控制台,所以 C++ 无法处理它。修复可能是从 C# 获取控制台句柄,将其传递给 C++,并使用它将 std::cout 连接到控制台窗口。但我不知道该怎么做。

有什么想法吗?

编辑:我的 C++ 代码是非托管的。

【问题讨论】:

标签: c# .net c++ dll console


【解决方案1】:

coutmain() 执行时由 C/C++ 运行时连接。因此,如果 C++ 代码仅限于 DLL,则可能没有要写入的 cout。 (这是过于简单化了,但你明白了。)

Console.Out 是一个System.IO.TextWriter。如果您的 C++ 代码是托管的,您可以将它传递给您的 DLL 并写入它。但是,如果您通过 P/Invoke 调用它,我怀疑情况并非如此。也许使用命名管道?

【讨论】:

  • 它在 C++ 运行时库初始化时连接起来,DLL 也会发生这种情况。
【解决方案2】:

基本上,C++ 运行时没有正确链接到控制台,因为它应该创建它。有一个std::sync_with_stdio 函数应该正确链接std::cout

【讨论】:

  • 谢谢,但是 sync_with_stdio(ios_base 中的静态函数)没有帮助。
猜你喜欢
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 2020-11-05
  • 2012-09-21
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
相关资源
最近更新 更多