本文介绍 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。