我正在尝试使用P Invoke将包含字符串数据的结构从C#传递到C ++。请查看下面我正在使用的代码。我可以传递该结构,但是SubData结构内部的值显示为垃圾值。
'''C ++
struct SubData
{
public:
int subData; // Tape data
char* stringData;
};
struct IntList
{
public:
int clsTapeData; // Tape data
int dataArray[10];
SubData SubDataArray[10];
};
IntList OutFunction(TestClass* instance, IntList* data)
{
data->dataArray[0] = 50;
data->clsTapeData = 50;
SubData subData;
subData.subData = 10;
subData.stringData = "Hai";
data->SubDataArray[0] = subData;
IntList retData;
retData.clsTapeData = 15;
return retData;
}
'''
'''C#代码
[StructLayout(LayoutKind.Sequential, Pack =4)]
public struct IntList
{
public int data;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public int[] dataArray ;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public SubData[] SubDataArray;
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SubData
{
public int subData;
[MarshalAs(UnmanagedType.LPStr, SizeConst = 10)]
public string stringData;
};
[DllImport("CppTestApp", EntryPoint = "OutFunction", CallingConvention = CallingConvention.Cdecl)]
public static extern TestClass.IntList OutFunction(IntPtr instance, out TestClass.IntList pclsTapeList);
'''
使用上面尝试的代码,但是我得到的是垃圾值。有人可以指出以上代码中的问题吗?
您需要指定StructLayout
(MSDN),以强制结构在字段中的顺序顺序如下(LayoutKind.Sequential
),或使用LayoutKind.Explicit
为每个字段明确指定偏移量:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct IntList
{
...
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SubData
{
...