从非托管 c++ 调用 C# 函数(通过托管包装器)

Posted

技术标签:

【中文标题】从非托管 c++ 调用 C# 函数(通过托管包装器)【英文标题】:Calling a C# function from unmanaged c++ (via a managed wrapper) 【发布时间】: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 中显示的字符串形式。 【参考方案1】:

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

注意事项

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

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

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

【讨论】:

嗨,Lou,感谢它让我开始了。对于其他感兴趣的人,我也刚刚发现了这个msdn.microsoft.com/en-us/library/367eeye0(v=vs.80).aspx,这有助于理解事情。 请仔细注意我回答中的第 2 点,否则您的对象可能会在您回调它之前被 GC 处理。函数指针的存在不持有引用。

以上是关于从非托管 c++ 调用 C# 函数(通过托管包装器)的主要内容,如果未能解决你的问题,请参考以下文章

从非托管 c++ 调用托管 c# 函数

将数组从非托管 C++ 传递到 C#

从 C# 线程调用非托管代码

如何附加调试器以从托管(C#)包装器进入本机(C++)代码?

通过 CLI 包装器在非托管 C++ 中使用 C#.NET Winform - 需要线程?

C# 使用 CLI 包装器调用非托管 C++