2009-10-01 11 views
0

我有一個C api,我使用p/invoke從我的C#應用​​程序中的api調用一個函數。函數簽名是:使用p/invoke從C api調用函數

int APIENTRY GetData (CASHTYPEPOINTER cashData); 

類型定義:

typedef CASHTYPE* CASHTYPEPOINTER; 

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

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

如何將我的C#方法的簽名和數據類型?

謝謝。

回答

3

你需要使用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

它很完美,謝謝 – frameworkninja 2009-10-01 08:50:37

0

我覺得它可能看起來像這樣

 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

對不起,我忘了補充MarshalAs特性CURRENCYTYPE陣! – 2009-10-01 09:08:03

+1

您還可以引用CURRENCYTYPE類型(來自CASH),但只定義了CURRENCY。我相信C問題的結構應該是CASHTYPE和CURRENCYTYPE。 – 2009-10-01 11:48:51

+0

另一個錯字,我修好了 – 2009-10-03 06:15:03