【问题标题】:Possible to call C++ code from C#?可以从 C# 调用 C++ 代码吗?
【发布时间】:2010-10-30 10:58:14
【问题描述】:

是否可以从 .NET 语言(如 C#)中调用可能编译为代码库文件 (.dll) 的 C++ 代码?

特别是 C++ 代码,例如 RakNet 网络库。

【问题讨论】:

标签: c# .net c++ unmanaged managed


【解决方案1】:

调用 C++ 的一种简单方法是在 C++/CLI 中创建包装程序集。在 C++/CLI 中,您可以像编写本机代码一样调用非托管代码,但您可以从 C# 调用 C++/CLI 代码,就好像它是用 C# 编写的一样。该语言基本上被设计为与现有库的互操作,作为其“杀手级应用”。

例如 - 使用 /clr 开关编译它

#include "NativeType.h"

public ref class ManagedType
{
     NativeType*   NativePtr; 

public:
     ManagedType() : NativePtr(new NativeType()) {}
     ~ManagedType() { delete NativePtr; }

     void ManagedMethod()
      { NativePtr->NativeMethod(); } 
}; 

然后在 C# 中,添加对 ManagedType 程序集的引用,并像这样使用它:

ManagedType mt = new ManagedType();
mt.ManagedMethod();

查看this blog post 了解更多解释示例。

【讨论】:

  • 博客文章的链接已损坏 :(
【解决方案2】:

P/Invoke 是一项不错的技术,它运行良好,除了加载目标 DLL 文件时出现问题。我们发现最好的方法是创建本地函数的静态库并将其链接到依赖它的托管 C++(或 C++/CLI)项目。

【讨论】:

  • 我遇到了回调和 p/invoke 问题。切换到 C++/CLI 已经解决了这些问题。
【解决方案3】:

我不熟悉你提到的库,但总的来说有几种方法:

  • P/Invoke 导出库函数
  • 添加对 COM 类型库的引用(以防您处理 COM 对象)。

【讨论】:

    【解决方案4】:

    是的,它叫P/Invoke

    这是一个很好的资源站点,可以将它与 Win32 API 一起使用:

    http://www.pinvoke.net/

    【讨论】:

      【解决方案5】:

      当然是。 This article 是一个很好的例子,说明你可以做一些事情来开始这件事。

      我们在 Windows Mobile 设备上使用 C# 执行此操作,使用 P/Invoke

      【讨论】:

        【解决方案6】:

        用于执行此操作的技术称为P/Invoke;您可以搜索有关该主题的文章。请注意,它是用于从 C# 调用 C,而不是 C++。因此,您需要将 C++ 代码包装在 DLL 导出的 C 包装器中。

        【讨论】:

          【解决方案7】:

          你考虑过 Apache Thrift 吗?

          http://thrift.apache.org/

          这似乎是一个非常巧妙的解决方案。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-05-10
            • 1970-01-01
            • 2023-03-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多