Привязки C # для библиотеки C ++

Я создал привязки c # для библиотеки libpostal (ссылка на LibPostalNet).

Я использовал CppSharp для создания привязок. Это работает, но я не знаю, как конвертировать этот код:

typedef struct libpostal_address_parser_response
{
size_t num_components;
char** components;
char** labels;
}
libpostal_address_parser_response_t;

CppSharp преобразует код следующим образом:

public sbyte** Components
{
get
{
return (sbyte**)((global::LibPostalNet.LibpostalAddressParserResponse.__Internal*)__Instance)->components;
}

set
{
((global::LibPostalNet.LibpostalAddressParserResponse.__Internal*)__Instance)->components = (global::System.IntPtr)value;
}
}

public sbyte** Labels
{
get
{
return (sbyte**)((global::LibPostalNet.LibpostalAddressParserResponse.__Internal*)__Instance)->labels;
}

set
{
((global::LibPostalNet.LibpostalAddressParserResponse.__Internal*)__Instance)->labels = (global::System.IntPtr)value;
}
}

Код должен возвращать строковый массив длины num_components.

Можете ли вы помочь мне решить это?

2

Решение

Это немного сложно, так как это указатель на список указателей символов, что-то очень похожее на массив строк.

Вам нужно перебрать указатели, извлечь внутренние указатели и преобразовать их в строки (я предполагаю, что вы можете использовать неуправляемый код):

libpostal_address_parser_response response = (retrieve from the library);

List<string> components = new List<string>();
List<string> labels = new List<string>();

//Not sure the name of num_components as you haven't added it to the question
//check if the name is correct
for(int buc = 0; buc < response.NumComponents; buc++)
{
sbyte* pLabel = response.Labels[buc];
sbyte* pComponent = response.Components[buc];

labels.Add(Marshal.PtrToStringAuto((IntPtr)pLabel));
components.Add(Marshal.PtrToStringAuto((IntPtr)pComponent));
}

//Now you have the components and the labels in their respective lists ready for usage.
1

Другие решения

Других решений пока нет …