通过c++;c#应用程序的结构
我的cpp文件中有以下结构:通过c++;c#应用程序的结构,c#,c++,interop,C#,C++,Interop,我的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) st
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)
struct EntityData
{
char globalId[512];
int mySpeed;
double x;
double y;
double z;
double h;
double p;
double r;
};
此方法已公开,因此我可以在我的c#应用程序中使用此方法,并且我不断收到一个错误:
封送处理指令异常
我的c#代码:
我错过了什么?来自网站,上面写着:
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;
// ...
}
当您有“指向以null结尾的ANSI字符数组的指针”但您有的却是固定长度数组时,将使用
LPStr
。来自
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;
// ...
}
当您有“指向以null结尾的ANSI字符数组的指针”但您有一个固定长度数组时,将使用
LPStr
。最终解决。
问题在于,我从cpp结构返回指向该结构的指针:
extern "C" { __declspec(dllexport) getDataStruct(int index)
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));
终于解决了。
问题在于,我从cpp结构返回指向该结构的指针:
extern "C" { __declspec(dllexport) getDataStruct(int index)
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));
您是否尝试了
char[]
或string
而不是StringBuilder
?尝试了这两种方法,但都无效,除了UnmanagedType.ByValArray
或ByValTStr
和char[]
LPStr
应该与char*
一起使用,这样也许可以解决问题。您是否尝试过char[]
或string
而不是StringBuilder
?尝试过这两种方法,但都不起作用,除了非托管类型.ByValArray
或ByValTStr
和char[]
之外LPStr
应该与char*
一起使用,所以这可能会解决问题。