2014-09-05 2 views
0

Эта функция в Oculus SDK дает код ошибки 0xc0000005:C# сортировочных структура массива - FatalExecutionEngineError

[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); 

Вот являются Struct декларации:

[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.

Я чувствую, что мне нужно указать размеры где-нибудь в сигнале функции? И мне интересно, ограничены ли они выходными параметрами или любыми параметрами «массива структуры».

+0

4.5.2 имеет поддержку Simd и векторные классы для поддержки. – Jay

+0

Да, это очень редко заканчивается. Вы говорите марсоллеру pinvoke, чтобы скопировать собственный массив и уничтожить его. Последний неизменно бомбит. Остается только надеяться, что объявление неверно, используйте простой атрибут 'ovrVector2f [] uvScaleOffsetOut', no out. И передайте массив, достаточно большой. –

ответ

2

Параметры массива объявлены неверно. Использование out вводит ложный дополнительный уровень косвенности. Вам нужно передать массив, который вы выделите, и пусть неуправляемый код заполняет его. Объявить параметр как этого

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

Выделяет массив перед вызовом функции:

ovrVector2f[] uvScaleOffsetOut = new ovrVector2f[2]; 

FWIW это помогло бы, если бы вы показали неуправляемую сторону интерфейса.

Смежные вопросы