2016-08-26 18 views
11

Więc mam C API z poniższej strukturyJak używać C struct z tablicy 2D w C# Jedności

typedef struct mat4f_ { float m[4][4]; } mat4f; 

Robi przekazany jako parametr do jednego z moich funkcji API:

void myFunction(const mat4f matrix); 

ja eksportu tej funkcji C# w Jedności użyciu dll:

[DllImport ("mylib")] 
private static extern void myFunction(mat4f matrix); 

moje pytanie, co mam mak e odpowiednia struktura C# jest?

Teraz mam następujące:

[StructLayout(LayoutKind.Sequential)] 
public struct mat4f 
{ 
    public float[,] m; 
} 

i używać spróbuj użyć funkcji w następujący sposób:

//Just make an identity matrix 
mat4f matrix; 
matrix.m = new float[4, 4] { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 1 } }; 

myFunction(matrix); //Call dll function 

Jest to poprawne rzeczą do zrobienia? Czy jest lepszy sposób to zrobić?

Odpowiedz

4

W przypadku macierzy 4 × 4 można użyć UnityEngine.Matrix4x4. Jeśli chcesz użyć własnego struct, polecam Ci wdrożyć go w ten sam sposób UnityEngine.Matrix4x4 jest realizowany:

[StructLayout(LayoutKind.Sequential)] 
public struct mat4f 
{ 
    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; 

    public static mat4f Identity = new mat4f 
    { 
     m11 = 1.0f, 
     m22 = 1.0f, 
     m33 = 1.0f, 
     m44 = 1.0f 
    }; 
} 

To blittable type. Blittable typy nie wymagają konwersji, gdy są przekazywane między zarządzanym i niezarządzanym kodem.

Przykładowe użycie:

mat4f matrix = mat4f.Identity; 
myFunction(matrix); // Call DLL function 

Istniejące implementacje jest podobna do tej, którą przedstawionej powyżej.

1

Przekazywanie struktury C# do zaimportowanej funkcji takiej, jak robisz, jest poprawne, ale powinieneś określić długość tablicy w strukturze, nawet jeśli później określisz jej rozmiar.

Deklaracja c zasadzie określa tablicę o długości 16, więc chciałbym określić C# struct następująco:

[StructLayout(LayoutKind.Sequential)] 
public struct mat4f 
{ 
[MarshalAs(UnmanagedType.ByValArray, SizeConst=16)] public float[,] m; 
} 

Możesz przeczytać więcej o tym, jak tablice są przetaczane here.