J'essaye d'appeler à un dll hérité compilé à partir du code FORTRAN. Je suis nouveau à Interop, mais j'ai lu quelques articles à ce sujet et il semble que mon cas devrait être assez simple.Violation de mémoire protégée appelant DLL FORTRAN à partir de C#
La méthode que je veux vraiment appeler a une signature de méthode complexe, mais je ne peux même pas appeler cette méthode GetVersion simple sans obtenir une violation de la mémoire protégée.
Voici mon code DllImport:
[DllImport("GeoConvert.dll",
EntryPoint="[email protected]",
CallingConvention=CallingConvention.StdCall)]
public static extern void GetGeoConvertVersion([MarshalAs(UnmanagedType.LPStr, SizeConst=8)]
ref string version);
Voici le code FORTRAN:
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
Voici mon test unitaire qui échoue:
[Test]
public void TestGetVersion()
{
string version = "";
LatLonUtils.GetGeoConvertVersion(ref version);
StringAssert.IsNonEmpty(version);
}
Voici le message d'erreur que je reçois:
System.AccessViolationException
Message: Attempted to read or write protected memory.
This is often an indication that other memory is corrupt.
Autres choses que j'ai essayé:
- Utilisation de la valeur par défaut marshalling
- Le passage d'un char [] au lieu d'une chaîne (obtenir des erreurs de signature de la méthode à la place)
Je suis un peu choqué que vous » utilisez toujours un compilateur Microsoft Fortran. (Leur dernier compilateur Win32 Fortran était en 1994, n'est-ce pas?) La plupart des gens que je connais qui développent Fortran sous Windows utilisent soit DEC/Compaq/HP/Intel Visual Fortran ou Gfortran dérivé de MinGW. –
D'un autre côté, si le code binaire fonctionne, il n'y a pas de raison de recompiler. C'est probablement un fort désincitatif à améliorer. –