2010-05-06 5 views
2

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

Я пытаюсь создать программу окон, используя 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++, но Visual Studio 2010 не имеет IntelliSense для C++/CLR. Если вы можете указать мне на что-то лучшее, не стесняйтесь делать это.

ответ

1

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

[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 на объем используемой вами памяти (который не может превышать объем памяти, который вы первоначально выделили без исключения).

 Смежные вопросы

  • Нет связанных вопросов^_^