Bonjour,
J'ai des problèmes pour appeler une librarie fortran.
je n'arrive pas à trouver le prototype C# permettant d'appeler la méthode SetData.
J'ai Visual Fortran d'un côté et VS2012 de l'autre.
J'ai fait une appli console c#. j'ai paramétré cette application pour pouvoir exécuter ma DLL fortran en mode debug.
code fortran:
Le code fortran fait référence à ce fichier. De ce que j'ai compris, fortran ne permet pas d'inclure des types characterdans une struct, c'est pourquoi le type F_LSP_File a été redéfini dans la méthode SetData, remplaçant les integer*2 par des Character(N).
Code : Sélectionner tout - Visualiser dans une fenêtre à part 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
Côté C# cela donne ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
J'ai toujours des problèmes de violation mémoire, ou de type non attendu... je ne sais plus trop quoi tester...
Code : Sélectionner tout - Visualiser dans une fenêtre à part 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23[StructLayout(LayoutKind.Sequential)] public struct F_Lsp_File { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)] public string FileName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)] public string FilePath; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)] public string TypeName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)] public string FormatName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 3)] public string Extention; [MarshalAs(UnmanagedType.I2, SizeConst = 2)] public short IndexEngine; } [DllImport("LSPTOW.dll", EntryPoint = "SetData", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] public static extern void LSP_SetData( [MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.Struct)] ref F_Lsp_File[] Fos_Data, ref int Num_Elem);
le code fortran suivant:
status=safeArrayAccessData(VBARRAY_PTR,F_File_ptr) inclut surement d'utiliser des types SafeArray. j'ai même essayer les attributs de ce type dans ma signature [MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.Struct)], sans résultats...
J'ai déja réussi a passer des valeurs dans les variables correspondantes (FilePath, Filename...) il faut bien forcer l'unicode côté c# avec UnmanagedType.BStr sur les variables de la structure, mais tout était désordonné.
Please help

 

 
		
		 
         
 

 
			
			


 
			

 P/Invoke C# + Fortran77
 P/Invoke C# + Fortran77
				 Répondre avec citation
  Répondre avec citation
Partager