整数类型传递:byte、short、int、long等整数传递
对于普通的整数来说,C#和C++的内存结构并没有太大的差异,其实对于绝大部分的语言来说,整数在内存中的结构,基本都是相同的。举个例子,如果如果想把C#中的int类型传递给C++,只需要在C++的函数上定义一个int类型,在C#的定义中也使用一个int类型就可以了。
下面是整数类型传递C++和C#的案例。
C++定义如下:
_declspec(dllexport) int TestMethod(uint8_t uint8, int8_t int8_t, int16_t int16_t, uint16_t uint16_t,int32_t int32_t,uint32_t uint32_t,int64_t int64_t,uint64_t uint64_t);
C#定义如下:
[DllImport("TestDll.dll")]
public static extern int TestMethod(byte uint8, sbyte int8_t, short int16_t, ushort uint16_t, int int32_t, uint uint32_t, long int64_t, ulong uint64_t);
C#的各种整数类型在C++都有对应的关键字,下面是对应的列表。
类型说明 | 取值范围 | C# 关键字 | .NET 类型 | 本机类型(C++关键字) |
---|---|---|---|---|
8位有符号整数 | byte | System.Byte | uint8_t | |
8位无符号整数 | sbyte | System.SByte | int8_t | |
16位有符号整数 | short | System.Int16 | int16_t | |
16位无符号整数 | ushort | System.UInt16 | uint16_t | |
32位有符号整数 | int | System.Int32 | int32_t | |
32位无符号整数 | uint | System.UInt32 | uint32_t | |
64位有符号整数 | long | System.Int64 | int64_t | |
64位无符号整数 | ulong | System.UInt64 | uint64_t | |
指针类型 | nint | System.IntPtr | intptr_t | |
指针类型 | nuint | System.UIntPtr | uintptr_t |
布尔类型(Bool)传递
将C#中的布尔类型传递给C++,C++要想将布尔类型返回给C#,他们之间类型的对应关系如下:
类型说明 | 取值范围 | C# 关键字 | .NET 类型 | 本机类型(C++关键字) |
---|---|---|---|---|
布尔类型 | true或者false | bool | System.Boolean | BOOL |
下面是布尔类型传递的具体C#和C++代码示例
C++定义如下:
_declspec(dllexport) BOOL TestMethodBool(BOOL isTrue);
C#定义如下:
[DllImport("LZ.Core.dll")]
public static extern bool TestMethodBool(bool isTrue);
时间(Date)类型传递
C#可以将时间类型DateTime传递给C++,也可以将C++的DATE返回给C#。具体的类型对应关系如下:
类型说明 | 取值范围 | C# 关键字 | .NET 类型 | 本机类型(C++关键字) |
---|---|---|---|---|
时间类型 | DateTime | System.DateTime | DATE |
下面是时间类型传递具体的C++和C#代码,可以将C#的DateTime传给C++,同时也可以用DateTime接受C++返回的DATE类型数据。
C++代码如下:
_declspec(dllexport) DATE TestDateTime(DATE date);
C#代码如下:
[DllImport("TestDll.dll")]
public static extern DateTime TestDateTime(DateTime date);
Guid类型传递
C#可以将Guid类型传递给C++,C++也可以将GUID类型返回给C#。具体的类型对应关系如下:
类型说明 | 取值范围 | C# 关键字 | .NET 类型 | 本机类型(C++关键字) |
---|---|---|---|---|
Guid类型 | Guid | System.Guid | GUID |
C++代码如下:
_declspec(dllexport) GUID TestGuid(GUID guid);
GUID TestGuid(GUID guid)
{
char buffer[64] = { 0 };
sprintf_s(buffer, "{%08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X}",
guid.Data1, guid.Data2, guid.Data3,
guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],
guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
GUID newGuid = { 32,25,26,0};
char buf[64]{};
sprintf_s(buf, "{%08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X}",
newGuid.Data1, newGuid.Data2, newGuid.Data3,
newGuid.Data4[0], newGuid.Data4[1], newGuid.Data4[2], newGuid.Data4[3],
newGuid.Data4[4], newGuid.Data4[5], newGuid.Data4[6], newGuid.Data4[7]);
return newGuid;
}
以上C++代码中,我们将接收到的GUID类型数据,转换为char数据,方便我们在调试的时候,直接查看GUID的字符串的值。同时我们新建一个新的WIN32 GUID类型的数据,返回给C#。
C#代码如下:
//Guid类型传递
[DllImport("TestDll.dll")]
public static extern Guid TestGuid(Guid guid);
委托类型传递:实现C++调用C#
众所周知,C#中委托是对一个方法的封装。我们将委托传递给C++,C++通过函数指针接受这个委托。然后C++调用函数指针,就相当于是调用C#的方法了。