Accés dll C via C#

nnicolas Messages postés 1 Date d'inscription mercredi 2 janvier 2008 Statut Membre Dernière intervention 17 septembre 2008 - 17 sept. 2008 à 11:12
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 20 sept. 2008 à 21:21
Bonjour,

Je rencontre une Exception AccesViolation lorsque j'appelle une méthode de la dll c via mon prog en c#.
La méthode appelée à pour argument une structure composée de plusieurs champs de type Byte[].

J'ai remarqué que si je passe, à la place de la structure qui cause l'exception, un Byte[] dont la taille est égale à celle de la somme des tailles des champs de ma structure, cela fonctionne mais il faut effectuer un traitement assez chiant pour remplir la stucture avec mon Byte[].

Voici comment elle déclarée la fonction en C
CPS_InformationsPorteur ( UINT16 NumSession, struct CPS_InfosPorteur PTR pIP,
struct CPS_StatusService PTR pStatusService, PUINT16 pEtatCarte);

En c#
[DllImport("System\\cpsw32.dll", EntryPoint = "#8", CharSet = CharSet.Ansi)]
        public static extern UInt16 CPS_InformationsPorteur(UInt16 NumSession, ref CPS_InfosPorteur InfosPorteur, ref CPS_StatusService StatusService, ref UInt16 EtatCarte);

La structure qui cause l'exception:
typedef struct CPS_InfosPorteur {
UINT8 CodeCivilite    [2];
UINT8 NomPatronym    [27];
UINT8 NomMarital    [27];
UINT8 Prenoms    [3][27];
UINT8 PrenomUsuel    [27];
UINT8 CodeLangues    [4][2];    
} CPS_InfosPorteur ;

En C# j'ai traduit cette structure par:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct CPS_InfosPorteur
    {
      public Byte[] CodeCivilite;
      public Byte[] NomPatronym;
      public Byte[] NomMarital;   
      public Byte[] Prenoms1;  
      public Byte[] Prenoms2;
      public Byte[] Prenoms3;
      public Byte[] PrenomUsuel;
      public Byte[] CodeLangues1;
      public Byte[] CodeLangues2;
      public Byte[] CodeLangues3;
      public Byte[] CodeLangues4;
    }

Je pense qu'il s'agit d'un pb de déclaration au niveau de ma structure.
Je ne m'explique pas que si je passe une ref vers une structure ne contenant que des Byte[] j'obtiens une Exception alors que si je passe un Byte[] ca passe...
Je ne comprend pas non plus le fait que passer une ref vers un Byte[] puisse poser des pb. Après tout, cela correspond à un passage par référence ce que fait nativement C# pour la majorité des types !

1 réponse

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
20 sept. 2008 à 21:21
Salut,

Quelle est la définition de UINT8 ?

A priori ta structure devrait avoir une signature plus ou moins de ce genre :

[StructLayout(LayoutKind.Sequential)]
public struct CPS_InfosPorteur
{
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst=2, ArraySubType=UnmanagedType.U1)]
    public Byte[] CodeCivilite;

    ...
}

/*
coq
MVP Visual C#
CoqBlog
*/
0
Rejoignez-nous