我的cpp文件中有以下结构:
struct EntityData
{
char globalId[512];
int mySpeed;
double x;
double y;
double z;
double h;
double p;
double r;
};
我有一个方法获取索引#并返回正确的结构:
extern "C" { __declspec(dllexport) getDataStruct(int index)
此方法已公开,因此我可以在我的c#应用程序中使用此方法,并且我一直收到错误:
编组指令异常。
我的c#代码:
[DllImport("my64.dll")]
[return: MarshalAs(UnmanagedType.LPStruct)]
public static extern EntityDataRx getDataStruct(int index);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct EntityDataRx
{
[MarshalAs(UnmanagedType.LPStr, SizeConst = 512)]
StringBuilder globalId;
int mySpeed;
double x;
double y;
double z;
double h;
double p;
double r;
}
我错过了什么?
答案 0 :(得分:4)
ByValTStr
类型用于出现在结构中的内联固定长度字符数组。其他类型适用于包含指向字符串指针的结构中包含的字符串引用。
从结构来判断
struct EntityData
{
char globalId[512];
// ...
}
您应该像这样定义C#结构:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct EntityDataRx
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
char[] globalId;
// ...
}
当“指向以ANSI结尾的空字符数组的指针时,会使用 LPStr
,但你所拥有的是一个固定长度的数组。
答案 1 :(得分:0)
终于解决了。 问题是,从cpp结构我返回一个指向结构的指针:
struct EntityData
{
char globalId[512];
int mySpeed;
double x;
double y;
double z;
double h;
double p;
double r;
};
并在我的c#应用程序中:
[DllImport("listenHLA1516e_64.dll")]
//[return: MarshalAs(UnmanagedType.Struct)] **cancelled not necessary**
public static extern IntPtr getDataStruct(int index);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct EntityDataRx
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
char[] globalId;
int mySpeed;
double x;
double y;
double z;
double h;
double p;
double r;
}
IntPtr a = getDataStruct(i);
EntityDataRx ent = (EntityDataRx)Marshal.PtrToStructure(a, typeof(EntityDataRx));