Структура Marshal к неуправляемому массиву - PullRequest
3 голосов
/ 31 марта 2010

У меня есть структура C # для представления декартового вектора, что-то вроде этого:

public struct Vector  
{  
    private double x;  
    private double y;  
    private double z;  

    //Some properties/methods
}

Теперь у меня есть неуправляемый Cll, который мне нужно вызвать с помощью P / Invoke. Некоторые методы ожидают двойной параметр [3].

Неуправляемая сигнатура C - это что-то вроде

void Cross(double a[3], double b[3], double c[3]);  

Есть ли способ установить сигнатуру P / Invoke, чтобы я мог передавать экземпляры моей структуры Vector и прозрачно распределять их по неуправляемому double [3]? Мне также понадобится двунаправленный маршалинг, поскольку неуправляемая функция должна записывать вывод в массив аргументов, поэтому я предполагаю, что мне нужно маршалировать как LpArray.

Ответы [ 2 ]

4 голосов
/ 31 марта 2010

Вы можете лежать в вашей декларации P / Invoke, члены будут правильно выровнены на всех текущих архитектурах ЦП, чтобы быть читаемыми как массив в неуправляемом коде:

[DllImport("blah.dll")]
private static extern void Cross(ref Vector a, ref Vector b, ref Vector c);
0 голосов
/ 31 марта 2010

У меня нет моих компиляторов, но мне интересно, можно ли использовать что-то вроде

[MarshalAs(...)]
[StructLayout(LayoutKind::Sequential, Pack=1)]
public struct Vector  
{  
    private double x;  
    private double y;  
    private double z;  

    //Some properties/methods
}

См. здесь и здесь и здесь

...