DLLImport avec Fortran et StructLayout
Bonjour,
Je dois accéder aux fonctions d'un DLL Fortran (non écris par moi) et pour une fonction, je dois travailler avec une structure (Type) en Fortran.
Malgré pas mal d'essais, je n'arrive pas à faire l'équivalence entre la classe C# et la structure Fortran 90.
Je reçois soit une erreur de memory protected (write or read...)
Class C#
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class SNodeDef
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)]
public string name;
[MarshalAs(UnmanagedType.I2)]
public short id;
[MarshalAs(UnmanagedType.R4)]
public float turb_min;
[MarshalAs(UnmanagedType.R4)]
public float turb_max;
[MarshalAs(UnmanagedType.Bool)]
public bool use_addm;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=4, ArraySubType = UnmanagedType.SysInt)]
public short[] ineq = new short[4];
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4, ArraySubType = UnmanagedType.SysInt)]
public short[] i_ineq = new short[4];
} |
Structure Fortran
Code:
1 2 3 4 5 6 7 8 9
| type node_def
character*256 :: name = ' ' ! name of the node
integer :: id = -1 ! the node id
real :: turb_min = -999999.
real :: turb_max = -999999.
logica :: use_addm =.false.
integer :: ineq(4)
integer :: i_ineq(4) |
Appel C# de la méthode
Code:
1 2 3 4 5
| [DllImport(@"flo_link.dll", CharSet = CharSet.Auto, EntryPoint = "GET_ECM_NODE_RELATED_DATA", CallingConvention = CallingConvention.Cdecl)]
public static extern short get_ecm_node_related_data(short nNodeID,
ref SNodeDef pNodeDef
); |
Un essai pour créer l'objet C#
Code:
1 2
| NativeClassDef.SNodeDef nodeDef = new NativeClassDef.SNodeDef();
NativeClassDef.get_ecm_node_related_data(nodes_to_control[i], ref nodeDef ); |
Si quelqu'un peut m'aider, merci d'avance !
David