C# bindings for a c++ library

C# bindings for a c++ library

本文关键字:c++ library for bindings      更新时间:2023-10-16

我已经为libpostal库创建了一个C#绑定(链接到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长度的字符串数组。

您能帮我解决这个问题吗?

这有点复杂,因为这些指针是指炭列表的指针,与一系列字符串非常相似。

您需要迭代指针,检索内部指针并将其转换为字符串(我假设您可以使用非托管代码):

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.