C# 调用 C++ DLL 的struct 传递
C++ .h
#pragma once
typedef struct
{
int nAge;
bool bUse;
double nDistance;
char name[200];
}LIDBATATYPE;
typedef struct
{
int progress;
char msg[100];
}OUTMSG;
extern "C" _declspec(dllexport) int _stdcall PassStruct(LIDBATATYPE *mdata); //指针
extern "C" _declspec(dllexport) int _stdcall sendMsg(OUTMSG &msg); //引用
C++ cpp
int _stdcall PassStruct(LIDBATATYPE *mdata)
{
int age = mdata->nAge;
bool use = mdata->bUse;
double distance = mdata->nDistance;
std::string n = mdata->name;
mdata->nAge = 101;
int a = age + 1;
return a;
}
int _stdcall sendMsg(OUTMSG &msg)
{
int pro = msg.progress;
msg.progress = 123;
//msg.msg = "cppmsg";
std::string str = "cppmsg";
//strcpy(msg.msg, str.c_str());
//str.copy(msg.msg, 7, 0);
int i;
for ( i = 0; i < str.length(); i++)
{
msg.msg[i] = str[i];
}
msg.msg[i] = '\0';
//printf("%s\n", p);
return msg.progress;
}
[StructLayout(LayoutKind.Sequential,CharSet =CharSet.Ansi)]
public struct OUTMSG
{
public int progress;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string msg;
}
public struct toCppData
{
public int nAge;
public bool bUse;
public double nDistance;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 200)]
public string name;
}
[DllImport(@"../../../Debug/CreateDLL.dll", EntryPoint = "test01", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
extern static int test01(int a, int b, int c);
[DllImport(@"../../../Debug/CreateDLL.dll", EntryPoint = "test02", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
extern static int test02(int a, int b);
[DllImport(@"../../../Debug/CreateDLL.dll", EntryPoint = "ReadRaster", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
extern static int ReadRaster();
[DllImport(@"../../../Debug/CreateDLL.dll", EntryPoint = "PassStruct", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
extern static int PassStruct(ref toCppData _data);
[DllImport(@"../../../Debug/CreateDLL.dll", EntryPoint = "sendMsg", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
extern static int sendMsg(ref OUTMSG msg);
static void Main(string[] args)
{
//int r1 = test01(1, 2, 3);
//int r2 = test02(5, 2);
// int r3 = ReadRaster();
// Console.WriteLine("test01结果:" + r3.ToString());
//Console.WriteLine("test02结果:" + r2.ToString());
toCppData data = new toCppData();
data.nAge = 100;
data.bUse = false;
data.nDistance = 3.1415926;
data.name = "abcd";
int v = PassStruct(ref data);
OUTMSG mMsg = new OUTMSG();
mMsg.progress = 999;
int ret = sendMsg(ref mMsg);
int progress = mMsg.progress;
Console.WriteLine("结果:" +mMsg.msg.ToString());
Console.ReadKey();
}