Bonjour à tous,

Tout d'abord j'espère ne pas me tromper d'endroit, y a du C#, du C++ et du VB donc entre les trois mon topic balance.


Voici mon soucis, je conçois actuellement une appli en .NET 4.5 C# et je dois consommer une dll d'un fournisseur qui a été produite en Visual C++ 2005.
Hors la doc de la dll explique juste comment consommer celle-ci en VB ou C++, pas en .NET !

J'ai beau consulter les forums et faire mes propres expériences rien n'y fait, soit j'ai un retour null soit des nombres aléatoires (pointeur je suppose).

Voici l'appel d’après la doc en VB:

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
19
Declare Function StartJob Lib "calcdll.dll" (ByRef p1 As Double, ByRef p2 As Variant, ByRef
p3 as Double) As Boolean
 
Const NINPUTDATA = 100
Const NRESDATA = 100
Const NOPTIONSDATA = 1
Const P60 = 1
 
Dim aInputData(NINPUTDATA) As Double
Dim aResult(NRESDATA) As Variant
Dim aOptions(NOPTIONSDATA) As Variant
 
aInputData(0) = 1 
aInputData(1) = 32
aInputData(2) = 50
aInputData(5) = 2000
...
 
a = StartJob(aInputData(0), aResult(0), aOptions(0))
La définition de la méthode C++ :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
extern "C" BOOL FAR PASCAL EXPORT StartJob(double vInp[NINPUTDATA], VARIANT vRis[NRESDATA], double
vOpt[NOPTIONSDATA]);
Et quelques infos utiles (ou pas):
DLLs are written with Visual C++ 2005, and the user needs to distribute the VC++ runtime also.
The DLL is compiled as UNICODE.
J'ai donc tenté de faire de même en C# mais je désespère en voyant les résultats que j'obtiens.
Voici mon code:

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
19
20
21
 [DllImport(DllPath, EntryPoint = "StartJob", CharSet = CharSet.Unicode)]
    private static extern bool StartJob( double[] p1, object[] p2, object[] p3);
 
      private const int NINPUTDATA = 100;
      private const int NRESDATA = 100;
      private const int NOPTIONSDATA = 1;
 
      private static double[] aInputData = new double[NINPUTDATA];
      private static object[] aResult = new object[NRESDATA];
      private static object[] aOptions = new object[NOPTIONSDATA];
 
 
    private static void Main(string[] args)
    {
      aInputData[0] = 94;
      aInputData[1] = 60;
      aInputData[2] = 10.4;
      aInputData[5] = 5200;
      //...
 
      var result = StartJob(aInputData, aResult, aOptions);
Et là, ben paf ça fait des chocapics !
Je ne sais quoi mettre à la place des objects... Qu'est-ce qu'un VARIANT ? Est-ce vraiment un array ? Dois-je faire du marshalling horrible que je ne comprends pas ?

Mon aResult qui est un array pouvant contenir des nombres, textes, etc... me revient avec 100 entrées 'null'.
Si je remplace par IntPtr ou byte, j'ai des nombres totalement aléatoires (adresse pointeur, donc au moins il se passe quelque chose).

Pourriez-vous m'aider afin que j'obtienne ce que j'attends de cette maudite DLL ?

En vous remerciant d'avance.

Phil