【问题标题】:Calling a C# function from unmanaged c++ (via a managed wrapper)从非托管 c++ 调用 C# 函数(通过托管包装器)
【发布时间】:2011-04-25 16:13:02
【问题描述】:

我有一组库的 C++ 源代码和标头,我需要从 C# 应用程序调用这些库。我已经围绕我需要的函数创建了一个托管 C++ 包装器,并且能够从 C# 调用它们来前后编组数据。

现在最困难的部分..

我的非托管 C++ 库在运行时会生成状态消息,我希望能够从调用 C# 应用程序中显示这些消息。我现在的想法是这样的:

我希望非托管 C++ 库代码在我创建它时传递给托管包装器的 C# 代码中调用一个函数。我在 Code Project 上找到了一些教程,但语法似乎已经过时了。

如果有人有一些示例代码或者可以为我指明一个好的教程的方向,那就太好了。

提前感谢您的帮助。

【问题讨论】:

  • 语法到底是怎么过时的?能给我们举个例子吗?
  • 既然你说 c++ 是一个库,为什么你的库需要调用你的代码。
  • 您使用的是托管 C++(旧语法)还是 C++/CLI(新语法)?如果您不确定,您是使用 ^ 作为 C++ 中托管对象的指针还是使用 *
  • 您好 Lou,我正在使用新的 C++/CLI 语法。我提到的旧式语法来自codeproject.com/KB/mcpp/unmanaged_to_managed.aspx
  • 您好重新运行,回调的目的是将状态消息传递回调用应用程序。它们采用我希望在 C# GUI 中显示的字符串形式。

标签: c# c++ callback unmanaged managed


【解决方案1】:

您可以将 .NET 委托传递给 C++/CLI 函数,该函数接受指向具有“匹配”参数的函数的指针。

注意事项

  1. 指向函数的指针必须是 STDCALL 调用约定
  2. 如果委托是对象的成员,则此函数指针将不计为保持对象活动的引用。在保持回调期间,您必须保持对对象的引用

由于您认为您的示例已经过时,我将假设您使用的是 C++/CLI 的新语法。这是一个代码项目,其中包含如何做到这一点的示例

http://www.codeproject.com/KB/mcpp/FuncPtrDelegate.aspx

【讨论】:

  • 嗨,Lou,感谢它让我开始了。对于其他感兴趣的人,我也刚刚发现了这个msdn.microsoft.com/en-us/library/367eeye0(v=vs.80).aspx,这有助于理解事情。
  • 请仔细注意我回答中的第 2 点,否则您的对象可能会在您回调它之前被 GC 处理。函数指针的存在不持有引用。
猜你喜欢
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 2011-01-24
相关资源
最近更新 更多