通过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/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。