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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
CPS_InformationsPorteur ( UINT16 NumSession, struct CPS_InfosPorteur PTR pIP, 
struct CPS_StatusService PTR pStatusService, PUINT16 pEtatCarte);
En c#
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
[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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
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:
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
[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 !