整数类型传递: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位有符号整数 byteSystem.Byteuint8_t
8位无符号整数 sbyteSystem.SByteint8_t
16位有符号整数 shortSystem.Int16int16_t
16位无符号整数 ushortSystem.UInt16uint16_t
32位有符号整数 intSystem.Int32int32_t
32位无符号整数 uintSystem.UInt32uint32_t
64位有符号整数 longSystem.Int64int64_t
64位无符号整数 ulongSystem.UInt64uint64_t
指针类型 nintSystem.IntPtrintptr_t
指针类型 nuintSystem.UIntPtruintptr_t

布尔类型(Bool)传递

将C#中的布尔类型传递给C++,C++要想将布尔类型返回给C#,他们之间类型的对应关系如下:

类型说明取值范围C# 关键字.NET 类型本机类型(C++关键字)
布尔类型true或者falseboolSystem.BooleanBOOL

下面是布尔类型传递的具体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++关键字)
时间类型 DateTimeSystem.DateTimeDATE

下面是时间类型传递具体的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类型 GuidSystem.GuidGUID

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#的方法了。