C# 与 C/C++ 互操作

C# 与 C/C++ 互操作

本文介绍 C# 与 C/C++ 互操作的方法,尤重点介绍 P/Invoke。

为什么要互操作?

主要有两个原因:

  • 用 C/C++ 编写算法核心代码,提高程序性能。
  • 有一些库 / API 需要通过 C/C++ 调用。

两种方法

主要有两种方法:C++/CLI 和 P/Invoke

C++/CLI

C++/CLI 相当于微软发明的一种新语言,在 C++ 中加入了托管要素。好处是 C# 可以直接调用,不用写 P/Invoke 胶水代码。

坏处呢?这个新的语言很复杂,既需要开发者熟悉 C++ 还要熟悉 C#,还有多出来的奇妙语法。

笔者不是很推荐使用。

P/Invoke

P/Invoke(Platform Invoke,平台调用)严格来讲可以用来调用一切外部库(如 .dll.lib)。但我们重点关注调用 C/C++。大概过程是:

  • 用正常的 C/C++ 来编写代码。但注意写 C++ 时要按 C 导出,即 extern "C"。否则符号名会被修改,不好操作。
  • 把 C/C++ 代码编译成 .dll
  • 在 C# 中写一个 “桥接” 类,用 DllImport 来导入 .dll 中的符号。(其实好像可以使用自动生成器来完成这一点)

笔者比较推荐 P/Invoke。

P/Invoke