2009-10-01 6 views
0

J'ai un C api et j'utilise p/invoke pour appeler une fonction de l'API dans mon application C#. La signature de la fonction est:Utilisation de p/invoke pour appeler une fonction à partir d'un C api

int APIENTRY GetData (CASHTYPEPOINTER cashData); 

Définitions Type:

typedef CASHTYPE* CASHTYPEPOINTER; 

typedef struct CASH 
{ 
int CashNumber; 
CURRENCYTYPE Types[24]; 
} CASHTYPE; 

typedef struct CURRENCY 
{ 
char Name[2]; 
char NoteType[6]; 
int NoteNumber; 
} CURRENCYTYPE; 

Comment serait ma signature de la méthode C# et types de données?

Merci.

Répondre

3

Vous devez spécifier les dimensions du tableau à l'aide SizeConst:

using System; 
using System.Runtime.InteropServices; 

public static class MyCApi 
{ 
    [StructLayout(LayoutKind.Sequential)] 
    public struct CASHTYPE 
    { 
     public int CashNumber; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)] 
     public CURRENCYTYPE[] Types; 
    } 

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
    public struct CURRENCYTYPE 
    { 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)] 
     public string Name; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)] 
     public string NoteType; 
     public int NoteNumber; 
    } 

    [DllImport("MyCApi.dll")] 
    public static extern int GetData(ref CASHTYPE cashData); 
} 
+0

cela fonctionne parfaitement, merci – frameworkninja

0

je pense qu'il peut ressembler à ceci

 using System.Runtime.InteropServices; 

     [StructLayout(LayoutKind.Sequential)] 
     public struct CASH{ 
      public int CashNumber; 
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)] 
      public CURRENCY Types[24]; 
     } 

    [ StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] 
     public struct CURRENCY { 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst=2)] 
      public string Name; 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst=6)] 
      public string NoteType; 
      public int NoteNumber; 
     } 

     class Wrapper { 
      [DllImport("my.dll")] 
      public static extern int GetData(ref CASH cashData} 
     } 
+0

désolé, j'oublié d'ajouter attribut MarshalAs tableau CURRENCYTYPE !! –

+1

Vous faites également référence au type CURRENCYTYPE (à partir de CASH) mais vous n'avez défini que CURRENCY. Je crois que les structures C de la question devraient être CASHTYPE et CURRENCYTYPE. –

+0

une autre faute de frappe, je l'ai réparé –

Questions connexes