将c ++结构传递给c#应用程序

时间:2017-09-19 08:46:18

标签: 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)

此方法已公开,因此我可以在我的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;
}

我错过了什么?

2 个答案:

答案 0 :(得分:4)

来自msdn documentation page它说:

  

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));
相关问题