Я никогда не пробовал это с такими типами массивов, но это первое решение может работать, и я уверен, что эта статья MSDN:
(Обратите внимание, что это работает только в том случае, если вы можете изменить определение функции на стороне C#). В вашей функции C# измените параметр IntPtr
на параметр double[,,]
и добавьте к нему этот атрибут MarshalAs, аналогично тому, как это делается в приведенной выше статье MSDN.
[DllImport("FooBar.dll")]
extern void Foo([MarshalAs(UnmanagedType.LPArray, SizeConst=**YOUR ARRAY SIZE HERE**)] double[,,] bar);
Это также предполагает, что у вас есть массив постоянного размера, и я не уверен, как это точно будет работать с трехмерным массивом, но если вы хотите подробнее изучить этот тип решения, вот полная документация для MarshalAsAttribute.
Другое решение очень похоже на противоположное этому другому вопросу. Вы должны инициализировать свой double[,,]
до нужного вам размера, а затем начать заполнять строки с помощью Marshal.Copy
(эта перегрузка). Вы также можете маршалировать по одному двойнику с той же функцией. Что-то вроде этого:
double[,,] arr = new double[25, 25, 200];
int il = arr.GetLength(0), jl = arr.GetLength(1), kl = arr.GetLength(2);
IntPtr values = DllFoo();
for (int i = 0; i < il; i++)
{
for (int j = 0; j < jl; j++)
{
for (int k = 0; k < kl; k++)
{
double[] temp = new double[1];
arr[i,j,k] = Marshal.Copy(values, temp, 1, k + j * jl + k * jl * kl);
}
}
}
Вы определенно можете выжать гораздо больше производительности из этого фрагмента, но он все равно должен работать.
person
Robert Rouhani
schedule
18.07.2015