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 : 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];
}
Structure Fortran
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)
Appel C# de la méthode
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
 
                                                       );
Un essai pour créer l'objet C#
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