通过C#代码来调用外部程序代码是非常常见的行为,外部程序主要以C语言编译的程序为主。如:windows api,第三方SDK库等。 目前大多数的底层些的程序都是使用C++语言开发并以C的方式导出,供外部调用。所以本次我们主要探讨下C++与C#之间的不解之缘。

在调用C++库文件之前,我们首先来了解下两种语言的数据类型对照关系。

基础类型对照表:

C++类型 C#类型 位数 取值范围
bool bool 8位 0~255
unsigned char byte 8位 0 ~ 255
[signed] char sbyte 8位 -128 ~ 127
[signed] int
long
int
Int32
32位 -2147483648
~ 2147483647
unsigned int uint
UInt32
32位 0 ~ 4294967295
[signed] short int short
Int16
16位 -32768 ~ 32767
unsigned short int ushort
UInt16
16位 0 ~ 65535
long int long
Int64
64位 -9223372036854775808
~ 9223372036854775807
unsigned long int ulong
UInt64
64位 0 ~ 18446744073709551615
float float 32位 -3.40282347E+38f
~ 3.40282347E+38f
double double 64位 -1.7976931348623157E+308
~ 1.7976931348623157E+308
long double double 64位 /
long long long
Int64
64位 /
wchar_t string 16或32位 /

备注:

  • int类型根据编译器不同,16位编译器int占2字节,32位和64位编译器,占4字节
  • C++中,signed int和int是等效的,int默认是有符号的。同样在C#中,int默认是Int32
  • C#中的char是占用两个字节默认是Unicode编码,C++中的char是占用一个字节。
  • wchar_t数据类型一般为16位或32位,但不同的C或C++库有不同的规定,如GNU Libc规定wchar_t为32位
  • C++中的wchar_t 是Unicode编码,char是ANSI编码。C#中的char是占用两个字节,16 位的 Unicode 字符

指针类型对照表:

C++类型 C#类型 描述
void * IntPtr IntPtr可以转换成对应的object类型
void ** out IntPtr 表示任意类型指向的指针
int& ref int 表示int类型的引用地址
int * ref int 表示int类型的指针地址
int[] int[] UnmanagedType.ByValArray
ArraySubType:UnmanagedType.I4
int* [] IntPtr[] UnmanagedType.ByValArray
ArraySubType:UnmanagedType.SysUInt
char * byte[]
IntPtr
ref byte
UnmanagedType.LPArray
char ** string  
const char * string (const string)  
char[n] string UnmanagedType.ByValTStr

未完待续……


本文会经常更新,请阅读原文: https://huchengv5.gitee.io//post/C++%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E5%9C%A8C-%E4%B8%AD%E7%9A%84%E8%A1%A8%E7%A4%BA%E6%96%B9%E6%B3%95.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名胡承(包含链接: https://huchengv5.gitee.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系