无法从Mono中的非托管代码中解组结构

无法从Mono中的非托管代码中解组结构,mono,marshalling,Mono,Marshalling,问题: 我可以成功地将包含根元素和数组元素的结构封送到非托管代码中,但无法恢复根元素数据(数组元素恢复正常)。我已经尝试了很多方法,但到目前为止都没有成功。下面是最简单的一个 我读过,认为我做的每件事都是正确的(但显然不是;-) 实施: C#声明: [StructLayout(LayoutKind.Sequential, Pack = 1)] private struct Vector3 { public float x; public float y; public f

问题:

我可以成功地将包含根元素和数组元素的结构封送到非托管代码中,但无法恢复根元素数据(数组元素恢复正常)。我已经尝试了很多方法,但到目前为止都没有成功。下面是最简单的一个

我读过,认为我做的每件事都是正确的(但显然不是;-)

实施:

C#声明:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
private struct Vector3
{
    public float x;
    public float y;
    public float z;
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
private struct MeshData
{
    [MarshalAs(UnmanagedType.LPArray)]
    public Vector3[] vertices;
    public int verticeCount;
}

[DllImport("MeshPlugin")]
private static extern bool ImportMesh([In, Out, MarshalAs(UnmanagedType.LPStruct)] MeshData meshData);
#pragma pack(1)
typedef struct VECTOR3
{
    float x;
    float y;
    float z;
} VECTOR3;

#pragma pack(1)
typedef struct MESHDATA
{
    VECTOR3 *vertices;
    int verticeCount;
} MESHDATA;
本机C声明:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
private struct Vector3
{
    public float x;
    public float y;
    public float z;
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
private struct MeshData
{
    [MarshalAs(UnmanagedType.LPArray)]
    public Vector3[] vertices;
    public int verticeCount;
}

[DllImport("MeshPlugin")]
private static extern bool ImportMesh([In, Out, MarshalAs(UnmanagedType.LPStruct)] MeshData meshData);
#pragma pack(1)
typedef struct VECTOR3
{
    float x;
    float y;
    float z;
} VECTOR3;

#pragma pack(1)
typedef struct MESHDATA
{
    VECTOR3 *vertices;
    int verticeCount;
} MESHDATA;
从C#调用如下:

<defined vertices and length...>

MeshData meshData = new MeshData();
meshData.vertices = mesh.vertices; // note that vertices[0].x = 111
meshData.verticeCount = 1;
ImportMesh(meshData); // calls native function
Debug.Log(meshData.vertices[0].x); // prints  222 which is correct, so array got marshaled back okay
Debug.Log(meshData.verticeCount); //  **prints 1 which is incorrect** so the int element did not come back okay
问题是结构的子数组值返回正确,但主结构元素返回错误

我也在C#中尝试过这个:

这一个在返回时严重崩溃(但是日志显示本机代码在本机端执行并打印了正确的值)

我尝试了其他属性装饰的排列方式,但是mono编译器建议删除一些不需要的属性,所以我就这么做了


我已经在谷歌上搜索了两天了,非常感谢您的帮助

我还没有试过,但这是我第一次尝试的方式:

[DllImport("MeshPlugin")]
private static extern bool ImportMesh(ref MeshData meshData);
如果仍然不起作用,我会尝试将struct声明更改为:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
private struct MeshData
{
    public IntPtr vertices;
    public int verticeCount;
}
MeshData meshData = new MeshData();
meshData.vertices = Marshal.AllocHGlobal (...);
// copy vertex data to the unmanaged array
meshData.verticeCount = 1;

谢谢罗尔夫。有趣的是顶点数组已经开始工作了,而不是结构中的整数。在您建议的更改中,我看不到verticeCount的封送方式有任何更改?干杯ref参数的封送方式不一定与[In,Out,marshallas(UnmanagedType.LPStruct)]参数相同:),但您是说我需要对所有内容执行Marshal.AllocHGlobal吗?例如,MeshData得到一个Marshal.AllocHGlobal,顶点数组也得到一个单独的数组?不,我有两个建议,首先只是更改DllImport。然后,如果这不起作用,请使用Marshal.AllocHGlobal对顶点数组进行手动编组。谢谢问题是,我需要手动来回复制/封送子数组数据,这非常混乱,因为marshal.copy不支持结构,PtrToStructure也不能在该配置中工作。它最终变成了一大堆代码。所以现在,我的解决方案是使用我的原始代码,但也将verticeCount填充到int数组中。再次感谢您抽出时间来帮忙!