[英]How pass a structure containing a void* from c++ to c#?
I am having an issue and I can't find the answer on the net. 我遇到问题,无法在网上找到答案。 I want to call a c++ function from my c# code.
我想从我的C#代码中调用C ++函数。 The c++ function is declared as:
c ++函数声明为:
int read(InfoStruct *pInfo, int size, BOOL flag)
with the following structure 具有以下结构
typedef struct
{
int ID;
char Name[20];
double value;
void *Pointer;
int time;
}InfoStruct;
In my c# code, I wrote: 在我的C#代码中,我写道:
public unsafe struct InfoStruct
{
public Int32 ID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string Name;
public Double value;
public void *Pointer;
public Int32 time;
};
[DllImport("mydll.dll", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern unsafe int read(out MeasurementInfoStruct[] pInfo, int size, bool flag);
I tried to run the code but it crashes so I guess I made a mistake with the structure specially the void* but I can't figure out what to put instead. 我试图运行代码,但是它崩溃了,所以我想我特别是在void *结构上犯了一个错误,但我不知道该放什么。 It could also be the fact that the function returns an array of structure and maybe I am not calling it right.
函数返回一个结构数组的事实也可能是事实,也许我没有正确地称呼它。 Could you help me with this?
你能帮我吗? thanks a lot.
非常感谢。
I have created a test application and the code is below and it is working fine... 我已经创建了一个测试应用程序,并且代码在下面,并且工作正常...
// CPP code
typedef struct
{
int ID;
char Name[20];
double value;
void *Pointer;
int time;
}InfoStruct;
int WINAPI ModifyListOfControls(InfoStruct *pInfo, int size, bool flag)
{
int temp = 10;
pInfo->ID = 10;
strcpy(pInfo->Name,"Hi");
pInfo->value = 20.23;
pInfo->Pointer = (void *)&temp;
pInfo->time = 50;
return 0;
}
/***************************************************/
// This is C# code
[StructLayout(LayoutKind.Sequential)]
public struct InfoStruct
{
public Int32 ID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string Name;
public Double value;
public IntPtr Pointer;
public Int32 time;
};
[DllImport(@"D:\Test\Projects\Release_Build\WeldDll.dll", CallingConvention = CallingConvention.Winapi)]
public static extern int ModifyListOfControls(ref InfoStruct pInfo, int size, bool flag);// ref InfoStruct pi);
public static void Main()
{
InfoStruct temp = new InfoStruct();
temp.Pointer = new IntPtr();
ModifyListOfControls(ref temp, 200, true);
Console.WriteLine(temp.ID);
Console.WriteLine(temp.Name);
Console.WriteLine(temp.time);
Console.WriteLine(temp.value);
Console.ReadLine();
}
/ * ** * ** Output * ** * ** * * 10 Hi 50 20.23 * ** * ** * ** * ** * ** * ** * * / / * ** * ** 输出 * ** * ** * * 10高50 20.23 * ** * ** * ** * ** * ** * ** * * * /
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.