C#/C++混编的情形经常会碰到,下面就来讲一讲一些需要注意的点。废话不多说,Let's get started. (时间有限,暂时没有写完,后续会持续更细。如果有写的不严谨甚至错误的地方欢迎大家指正)
一、C++导出函数的声明
在导出函数的头文件,经常见到如下的模板
#pragma once
下面就来给出解释。
- #ifdef __cplusplus这条预编译指令。如果项目是C++的项目,则用extern "C" {} 将所有的代码包起来。这样的好处是导出的函数名仍和代码中定义的一致,否则函数名前后会加上一些看起来很奇怪的符号。这是因为C++的函数有重载机制,同一个函数名,可以有多种参数形式,不加extern "C"包起来的话,编译器就会在函数名前后加上一些符号,来具体到这个函数的具体的某一种形式。
- #ifdef YOURPROJECT_EXPORTS这条预编译指令。这段话的意思就是如果定义了YOURPROJECT_EXPORTS这个宏,则把YOURPROJECT_API这个宏定义成__declspec(dllexport),否则把YOURPROJECT_API定义成__declspec(dllimport)。这个设计是为了开发者和调用者的便利性设计的。因为这个头文件,后来也会拷贝给调用者用,开发者的导出函数的这个项目中定义一个宏YOURPROJECT_EXPORTS,而调用者那边没有这个宏。所以YOURPROJECT_API对于开发者就是__declspec(dllexport),对于调用者就是__declspec(dllimpo