C#编组结构数组 - FatalExecutionEngineError

时间:2014-09-05 00:03:59

标签: c# .net pinvoke marshalling oculus

Oculus SDK中的此功能提供错误代码0xc0000005:

[DllImport(LibFile)]
private static extern void ovrHmd_GetRenderScaleAndOffset(ovrFovPort fov,
                                                          ovrSizei textureSize,
                                                          ovrRecti renderViewport,
                                                          [MarshalAs(UnmanagedType.LPArray, SizeConst = 2)]
                                                          [Out] out ovrVector2f[] uvScaleOffsetOut);

没有其他PInvoke函数抛出错误,但我认为这是不同的,因为输出是一个数组。实际上还有另一个函数返回一个数组,它给出了同样的错误:

[DllImport(LibFile)]
private static extern void ovrHmd_GetEyeTimewarpMatrices(IntPtr hmd, ovrEyeType eye, ovrPosef renderPose,
                                                         [MarshalAs(UnmanagedType.LPArray, SizeConst = 2)]
                                                         [Out] out ovrMatrix4f_Raw[] twnOut);

以下是结构声明:

[StructLayout(LayoutKind.Sequential)]
public struct ovrVector2f
{
    public float x, y;
}

[StructLayout(LayoutKind.Sequential)]
public struct ovrMatrix4f_Raw
{
    public float m00;
    public float m01;
    public float m02;
    public float m03;

    public float m10;
    public float m11;
    public float m12;
    public float m13;

    public float m20;
    public float m21;
    public float m22;
    public float m23;

    public float m30;
    public float m31;
    public float m32;
    public float m33;
}

看看SDK源代码,我知道至少ovrHmd_GetRenderScaleAndOffset看起来很无聊,我无法想象这个错误会来自SDK内部。

我觉得我需要在函数签名中的某处指定大小?我想知道它是否仅限于输出参数,或者任何和所有"结构的数组"参数。

1 个答案:

答案 0 :(得分:2)

数组参数声明不正确。 out的使用引入了虚假的额外间接层。您需要传递一个您分配的数组,并让非托管代码填充它。像这样声明参数

private static extern void ovrHmd_GetRenderScaleAndOffset(
    ovrFovPort fov,                                       
    ovrSizei textureSize,
    ovrRecti renderViewport,
    [Out] ovrVector2f[] uvScaleOffsetOut
);

在调用函数之前分配数组:

ovrVector2f[] uvScaleOffsetOut = new ovrVector2f[2];

FWIW,如果你展示了界面的非托管方面,它会有所帮助。