Я пытаюсь вызвать устаревшую dll, скомпилированную из кода FORTRAN. Я новичок в Interop, но я прочитал несколько статей об этом, и похоже, что мой случай должен быть довольно простым.
Метод, который я действительно хочу вызвать, имеет сложную сигнатуру метода, но я даже не могу вызвать этот простой метод GetVersion без получения нарушения защищенной памяти.
Вот мой код DllImport:
[DllImport("GeoConvert.dll",
EntryPoint="_get_version@4",
CallingConvention=CallingConvention.StdCall)]
public static extern void GetGeoConvertVersion([MarshalAs(UnmanagedType.LPStr, SizeConst=8)]
ref string version);
Вот код ФОРТРАНА:
SUBROUTINE GetVer( VRSION )
C
!MS$DEFINE MSDLL
!MS$IF DEFINED (MSDLL)
ENTRY Get_Version (VRSION)
!MS$ATTRIBUTES DLLEXPORT,STDCALL :: Get_Version
!MS$ATTRIBUTES REFERENCE :: VRSION
!MS$ENDIF
!MS$UNDEFINE MSDLL
C
CHARACTER*8 VRSION
C
VRSION = '1.0a_FhC'
C
RETURN
END
Вот мой модульный тест, который не прошел:
[Test]
public void TestGetVersion()
{
string version = "";
LatLonUtils.GetGeoConvertVersion(ref version);
StringAssert.IsNonEmpty(version);
}
Вот сообщение об ошибке, которое я получаю:
System.AccessViolationException
Message: Attempted to read or write protected memory.
This is often an indication that other memory is corrupt.
Другие вещи, которые я пробовал:
- Использование маршаллинга по умолчанию
- Передача char [] вместо строки (вместо этого получите ошибки подписи метода)