Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过c++;c#应用程序的结构_C#_C++_Interop - Fatal编程技术网

通过c++;c#应用程序的结构

通过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

我的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)
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*
一起使用,所以这可能会解决问题。