depuis une IHM en C#, je dois appeler plusieurs fonctions C/C++ d'une DLL.
dans le code C++, j'ai, par exemple, la fonction suivante (.h):
extern EXPORTTOTEM_API float LaunchDll_ForceRa ( char Version, float ErrMax, int &iMax, float &Roughness, struct RaConstants *constIn, struct RaInputs *dataIn);
associé avec le code .cpp suivant :
1 2 3 4 5
| extern "C" EXPORTTOTEM_API float LaunchDll_ForceRa ( char Version,
float ErrMax, int &iMax, float &Roughness, struct RaConstants *constIn, struct RaInputs *dataIn)
{
return Dll_ForceRa(Version, ErrMax, iMax, Roughness, constIn, dataIn);
} |
la structure RaConstants est la suivante :
1 2 3 4 5 6 7 8 9 10 11 12 13
| struct RaConstants
{
float aRa; //Adjusting coefficient (ratio roll Ra/ strip Ra)
float eelong; //adjusting exponent of elongation
float aelong; //offset of elongation
float melong; //elongation slope correction
float Rainf; //Roll Ra at infinite length
float Lc; //critical combination of roll and force
float CRa; //correction of resulting Ra
float eSF; //exponent of SF for the simar solution
float J; //coefficient to give form to the Brillouin function
float SFn; //nominal specific force, normalizes the SF
}; |
et RaInputs :
1 2 3 4 5 6 7 8
| struct RaInputs
{
float RaObj; //objective of desired Ra
float elong; //desired elongation
float RaNomFict; //Roll initial Ra (new or reused roll)
float LFn; //roll length and force combined and accumulated
}; |
La dll fonctionne parfaitement.
Mon problème est au niveau du code C#
Depuis l'IHM, l'utilisateur peut saisir l'ensemble des paramétres nécessaires puis doit lancer la méthode LaunchDll_ForceRa en cliquant sur un bouton.
J'ai ajouté le code suivant :
1 2
| [DllImport("DLL_RaFTmodel.dll", CharSet = CharSet.Ansi)]
static private extern float LaunchDll_ForceRa ( char Version, float ErrMax, out int iMax, out float Roughness, struct RaConstants *constIn, struct RaInputs *dataIn); |
et l'équivalent des structures :
1 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 class RaConstantsCSharp
{
public float aRa;
public float eelong;
public float aelong;
public float melong;
public float Rainf;
public float Lc;
public float CRa;
public float eSF;
public float J;
public float SFn;
}
[StructLayout(LayoutKind.Sequential)]
public class RaInputsCsharp
{
public float RaObj;
public float elong;
public float RaNomFict;
public float LFn;
}; |
comment passer la structure RaConstantsCSharp à la place de struct RaConstants *constIn et la structure RaInputsCsharp à la place de struct RaInputs *dataIn?
Egalement dans ma fonction, j'ai mis out int iMax à la place de int &iMax? Est-ce juste?
Merci pour votre aide.
Partager