2017-09-10 14 views
1

libpostalライブラリ用のC#バインディング(link to LibPostalNet)を作成しました。C++ライブラリ用のC#バインディング

私は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長の文字列配列を返す必要があります。

これを解決するお手伝いをしてもらえますか?

答えて

0

これは文字列の配列に非常によく似た文字のポインタのリストへのポインタなので、少し複雑です。

あなたは、ポインタを繰り返す内部ポインタを取得した文字列(私はあなたがアンマネージコードを使用することができると仮定している)に、それらを変換する必要があります:あなたの答えのための

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. 
+0

感謝。あなたは正しい、今それは動作します。私はエンコードに "PtrToStringAuto"の代わりに "PtrToStringAnsi"を使用しました。どうもありがとう。 – Matteo

+0

私はAutoを使用することをお勧めします。ある日ライブラリがansiの代わりに別のエンコーディングを使用することを決めた場合、コードを変更する必要はありません。 – Gusman

+0

PtrToStringAutoを使用すると、不正なエンコードされた文字列が取得されます。 – Matteo

関連する問題