Учитывая следующий модуль Fortran, я пытаюсь получить ссылку на переменную A, чтобы я мог манипулировать ею непосредственно в C #.
module FortranLibrary
use Sample_Data
implicit none
real(8) :: A
!DEC$ ATTRIBUTES DLLEXPORT :: A
!DEC$ ATTRIBUTES ALIAS: 'A' :: A
contains
SUBROUTINE GetA(value)
!DEC$ ATTRIBUTES DLLEXPORT :: GetA
!DEC$ ATTRIBUTES ALIAS: 'GetA' :: GetA
!DEC$ ATTRIBUTES REFERENCE :: value
REAL(8), INTENT(OUT) :: value
value = A
END SUBROUTINE GetA
subroutine DoWork()
!DEC$ ATTRIBUTES DLLEXPORT :: DoWork
!DEC$ ATTRIBUTES ALIAS: 'DoWork' :: DoWork
A = 41
return
end subroutine DoWork
end module
Если я вызываю GetA, я получаю значение назад, а не ссылку (изменение переменной на стороне C # не влияет на переменную Fortran и наоборот. Если я вызываю A, я получаю следующееисключение:
System.AccessViolationException: 'Попытка чтения или записи защищенной памяти. Это часто указывает на повреждение другой памяти.'
Не могу сказатьЯ удивлен этим, потому что A - экспорт данных, и хотя я ясно вижу его в списке как функцию в обходчике зависимостей, я понятия не имею, какой прототип у этой функции будет, или даже если это действительно функция или просто несовершенныйПользовательский интерфейс в средстве обхода зависимостей.
Вот как я импортирую эти элементы в C #:
[DllImport("FP1_Library.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void DoWork();
[DllImport("FP1_Library.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void GetA(ref double val);
[DllImport("FP1_Library.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void A(out double val);
Может кто-нибудь помочь мне экспортировать ссылку на переменную модуля в C #?