Как вызывать функции внутри C dll, которые принимают указатели в качестве аргументов из C # - PullRequest
2 голосов
/ 06 мая 2010

это мой первый пост здесь!

Я пытаюсь создать программу для форм Windows, используя C #, которая будет использовать предварительно скомпилированную библиотеку C. Он получит доступ к смарт-карте и предоставит вывод с нее. Для библиотеки у меня есть .dll, .lib и .h и нет источника. В файле .h определено несколько структур. Большинство интересных функций .dll ожидают, что указатели будут распределять структуры в качестве аргументов. Я вызывал функции внутри .dll так: например, функция

EID_API int WINAPI EidStartup(int nApiVersion);

будет называться так

[DllImport("CelikApi.dll")]//the name of the .dll
public static extern int EidStartup(int nApiVersion);

Теперь моя проблема в том, что я не могу найти эквивалент указателей C, которые указывают на динамически распределенные структуры в памяти в C #, поэтому я не знаю, что передать в качестве аргумента функциям, которые принимают указатели C.

У меня нет большого опыта работы с C #, но для меня его использование выглядело как самый простой способ создания нужной мне программы. Я пытался с C ++, но Visual Studio 2010 не имеет IntelliSense для C ++ / CLR. Если вы можете указать мне на что-то лучшее, не стесняйтесь.

1 Ответ

1 голос
/ 06 мая 2010

Вы можете сделать что-то вроде

    [DllImport("Operations.dll")]
    public static extern void Operation(
        [MarshalAs(UnmanagedType.LPArray)]ushort[] inData, 
        int inSize1, int inSize2,
        [MarshalAs(UnmanagedType.LPArray)]int[] outCoords,
        ref int outCoordsSize);

Этот код будет принимать динамически размещенный массив шорт без знака (ushort в C #), а также параметры с несколькими размерами (inSize1 и inSize2) и помещать результаты в массив outCoords размером outCoordsSize.

Ваш код C не может выделить память и ожидать, что C # будет хорошо с ним работать; C # должен распределять всю память, с которой играет ваш код C. В приведенном выше случае вы можете поместить размер массива outCoords в outCoordsSize, а затем заменить значение outCoordsSize на объем фактически используемой памяти (который не может превышать объем памяти, изначально выделенный без исключения).

...