Я использовать Fortran DLL, которая содержит тип со следующими сигнатуру (упрощенно):Работа с Fortran типа, содержащего указатель из управляемого кода
TYPE MyType
INTEGER(4) :: ii
REAL(8) :: rr
INTEGER(4) :: n_a0
INTEGER(4) :: n_a1
INTEGER(4), POINTER :: a0(:)
REAL(8) , POINTER :: a1(:)
END TYPE
Очевидно, что этот тип содержит указатели на целые числа и парном разряде. Я обращаюсь к этому типу с помощью следующего метода из другого кода Fortran плавно.
SUBROUTINE MySub(x)
TYPE(MyType) :: x
Моя цель состоит в том, чтобы работать с этим MyType
и MySub
через C# код. Для этого, я определил структуру в моем C# кода следующим образом:
struct MyType
{
public int ii;
public double rr;
public int n_a0;
public int n_a1;
public int[] a0;
public double[] a1;
}
и доступ к нему со следующим способом:
[DllImport("my_test.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void MySub(ref MyType t);
Проблема заключается в том, когда MySub
доступ пользователей без массива все в порядке , Но когда он пытается получить доступ к элементам массива, я получаю AccessViolationException
. Что мне делать, чтобы решить эту проблему?
Я также попытался изменить тип 'a0' и' a1' на 'IntPtr' и выделить их с помощью' Marshal.AllocHGlobal'. Но в этом случае я получил то же исключение. – melmi