【问题标题】:Using p/invoke to call a function from a C api使用 p/invoke 从 C api 调用函数
【发布时间】:2009-10-01 08:01:41
【问题描述】:

我有一个 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# 方法签名和数据类型如何?

谢谢。

【问题讨论】:

    标签: c# pinvoke


    【解决方案1】:

    您需要使用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);
    }
    

    【讨论】:

      【解决方案2】:

      我认为它可能看起来像这样

            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}
              }
      

      【讨论】:

      • 对不起,我忘记添加 MarshalAs 属性 CURRENCYTYPE 数组了!!
      • 您还引用了 CURRENCYTYPE 类型(来自 CASH),但只定义了 CURRENCY。我相信问题中的 C 结构应该是 CASHTYPE 和 CURRENCYTYPE。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      • 2013-05-31
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多