Использование p / invoke для вызова функции из C api - PullRequest
0 голосов
/ 01 октября 2009

У меня есть C api, и я использую p / invoke для вызова функции из API в моем приложении C #. Сигнатура функции:

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 # и типы данных?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 01 октября 2009

Вы должны указать размеры массива, используя 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 голосов
/ 01 октября 2009

Я думаю, это может выглядеть так

      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}
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...