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#
Structure Fortran
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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]; }
Appel C# de la méthode
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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)
Un essai pour créer l'objet C#
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 );
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Partager