Appeler une fonction C depuis c#

bossun Messages postés 173 Date d'inscription lundi 3 mars 2003 Statut Membre Dernière intervention 15 décembre 2010 - 3 mars 2009 à 10:39
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 - 4 mars 2009 à 20:51
Salut,


j'essaie désespérément d'appeler une fonction c depuis un programme c#.


Ma fonction C est déclarée comme tel :

Code :
extern "C" PAGODE
__declspec(dllexport)
__stdcall PagodePrice(char *ssj, double cours, char *cp, int jj, int mm, int aa, double strike, char *ae)
{
return _PagodePrice(ssj, cours, cp, jj, mm, aa, strike, ae) ;
}

la structure de retour est déclarée de la sorte :

Code :
typedef struct PAGODES
{
double value ;
double delta ;
double gamma ;
double vega ;
double theta ;
double rho ;
double dvega ;
double dvvm ;
double rsmile ;
double rdvmin ;
double vol ;
double volC ;
double vegart ;
double vegah ;
double rsmileh ;
double rsmilert ;
char ts[50] ;
} PAGODE ;

J'ai tenté d'appeler la fonction en utilisant

Code :
[DllImport("pagode32.dll", EntryPoint = "_PagodePrice@40")]
public static extern IntPtr PagodePrice(
[In]string X_CODE_Long, [In]double cours, [In]string cp, [In]int jj, [In]int mm, [In]int aa, [In]double strike, [In]string ae);

J'ai tenté de remplacer l'Entrypoint par le nom de la fonction
"PagodePrice", le type de retour IntPtr par une classe PAGODE
équivalente C# mais rien n'y fait

J'obtiens toujours une exception "AccessViolationException"

Citation:
"Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée"

Je suis sûr que la fonction de la DLL fonctionne parfaitement car déjà utilisée dans une vieux programme C.


J'utilise une autre fonction de cette DLL qui fonctionne très bien

Code :
[DllImport("pagode32.dll",EntryPoint="PagodeForward")]
public static extern double PagodeForward(
[In]string X_CODE_Long, [In]double cours, [In]int jj, [In]int mm, [In]int aa);


Est-ce que quelqu'un a une idée? Merci d'avance

Bossun

P.S1  C'est mieux de prendre son pied que de se prendre la tête!

/F

3 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
3 mars 2009 à 14:42
Salut, c'est étonnant que ta fonction renvoie une struct si complexe par valeur, P/Invoke n'est pas super à l' aise avec ce genre de signature. Récupérer un IntPtr ça signifie que la fonction renvoi un pointeur ce qui n'est pas le cas là, donc je ne vois que ça comme solution :

[ StructLayout(
    LayoutKind.Sequential,
        CharSet = CharSet.Ansi ) ]
private unsafe struct MYSTRUCT
{
    public int x;
    // MarshalDirectiveException !!
    //[ MarshalAs(
    //    UnmanagedType.ByValTStr,
    //        SizeConst = 2 ) ] //char s[ 2 ];
    //public string s;
 
    public fixed byte s[ 2 ];
}


[ DllImport( "PINVOKE.dll" ) ]
private static extern MYSTRUCT GetMyStruct( );
0
bossun Messages postés 173 Date d'inscription lundi 3 mars 2003 Statut Membre Dernière intervention 15 décembre 2010 1
4 mars 2009 à 14:32
Salut Lutinore

J'ai essayé tout plein de variantes mais rien n'y fait... toujours la même erreur

Bossun

P.S1  C'est mieux de prendre son pied que de se prendre la tête!

/F
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
4 mars 2009 à 20:51
As tu fais comme dans mon exemple, c'est à dire récupérer la struct par valeur et remplacer le tableau "ts" par un tableau inline de byte ( ou sbyte ) ?
0
Rejoignez-nous