Как сопоставить массив C в C #? - PullRequest
3 голосов
/ 08 декабря 2010

Мой вопрос связан с попыткой вызвать функцию, написанную на C из C #. Я заглянул в файл заголовка, поставляемый с библиотекой C, чтобы понять, какие функции существуют в Cll. Вот что я вижу:

код C (для функции с именем "LocGetLocations"):

typedef enum {
    eLocNoError,
    eLocInvalidCriteria,
    eLocNoMatch, 
    eLocNoMoreLocations,
    eLocConnectionError, 
    eLocContextError,
    eLocMemoryError
} tLocGetStatus; 

typedef void *tLocFindCtx;

typedef void *tLocation;    

PREFIX unsigned int POSTFIX LocGetLocations
(
    tLocFindCtx pCtx, 
    tLocation *pLoc,
    unsigned int pNumLocations,
    tLocGetStatus *pStatus
);

В C # у меня есть это:

[DllImport(@"VertexNative\Location.dll")]
public static extern uint LocGetLocations(IntPtr findContext, out byte[] locations, uint numberLocations, out int status);

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

Как вернуть массив на стороне C # и получить доступ к его данным?

Пример, который я привел в C, выглядит так:

tLocation lLocation[20];

// other stuff

LocGetLocations(lCtx, lLocation, 20, &lStatus)

Любая помощь будет высоко ценится!

Ответы [ 2 ]

2 голосов
/ 08 декабря 2010

Как правило, единственное, что имеет значение, это размер параметров. Насколько я помню, перечисления являются целыми числами в C, так что вы можете просто использовать это. Или лучше, воссоздать тот же enum в C #, я думаю, что это будет работать. Следует помнить одну вещь: при работе со сложными структурами необходимо использовать атрибуты, чтобы сообщить структуре о желаемом выравнивании элементов.

1 голос
/ 08 декабря 2010

В итоге работает эта подпись:

[DllImport(@"VertexNative\Location.dll")]
public static extern uint LocGetLocations(IntPtr findContext, [Out] IntPtr[] locations, uint numberLocations, out int status);

И я могу назвать это так (необходим некоторый рефакторинг):

IntPtr[] locations = new IntPtr[20];
int status;
// findContext is gotten from another method invocation
uint result = GeoCodesNative.LocGetLocations(findContext, locations, 20, out status);

Спасибо за помощь!

...