2016-10-31 6 views
1

私は2つの構造体のために、以下のCヘッダがあります。単純なリストであるC#の輸入構造

struct CustomerInfo 
{ 
    char* Id; 
    char* Name; 
    char* Address; 
}; 

struct CustomerList 
{ 
    CustomerInfo* Info; 
    CustomerList* Next; 
}; 

を。 CUSTOMERLISTは(そのポインタをまたはそれ以上)が返されるように

機能が

EXPORTC CustomerList* ListCustomer(void* bankPtr) 

エクスポートされbankPtrはここにいない問題であり、それを返す関数があります。ここで

は、私はC#で関数を呼び出す方法です:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
    public struct CustomerInfo 
    { 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] 
     public IntPtr Id; 
     public IntPtr Name; 
     public IntPtr Address; 
    } 

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
    public unsafe struct CustomerList 
    { 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] 
     CustomerInfo* Info; 
     CustomerList* Next; 
    }; 

    ... 

    [DllImport("bank.dll", EntryPoint = "ListCustomer", CallingConvention = CallingConvention.Cdecl)] 
    private unsafe static extern Customer* _ListCustomer(int bankPtr); 

次に、関数自体:

public unsafe static CustomerList* ListCustomer() 
    { 
     CustomerList* c = _ListCustomer(Init()); 

     return c; 
    } 

しかし、変数cは、私がアクセスすることを望んでいないフィールドがあります。

私のやり方の誤りは何ですか?このように構造体を渡すことは可能ですか?関数はC++ではなくCでエクスポートされているので、C++のいくつかの例が見つかりました。

更新

public unsafe static CustomerList* ListCustomer() 
{ 
    CustomerList* c = _ListCustomer(Init()); 
    Console.Write("customer list: " + (int)c); 

    string name = new string(c->Info->Name); 

    return c; 
} 

このエラーをprocudes:

私はNineBerryからの変更を行った後、それを次のようにアクセスしようとした

CS0193 The * or -> operator must be applied to a pointer 

更新#2:

NineBerryのアプローチを使用して、何とか働いていますが、ポインタが間違った方向を指しているようです。

Name ???????t??\P??????????? 
adr  ?????????????2????????????? 
Id  ????????????????????????????C:\WINDOWS\SYSTEM32\VCRUNTIME140D.dll 

Name ???????t??N 
adr  ?????????????2??????? 
Id  ???????????????????????▒???????? 

これらの結果は次のとおりです。

私は名前、住所、IDをプリントアウト。

+0

ありがとうございましたが、コンパイラはそれでOKではないようです。 'アドレスの取得、サイズの取得、またはマネージ型へのポインタの宣言( 'Bank.CustomerInfo') ' – fsp

答えて

2

このような構造体を宣言します。たとえば

public unsafe struct CustomerInfo 
{ 
     public sbyte* Id; 
     public sbyte* Name; 
     public sbyte* Address; 
} 

public unsafe struct CustomerList 
{ 
     public CustomerInfo* Info; 
     public CustomerList* Next; 
}; 

を、最初の顧客の名前にアクセスするには:

string name = new string(c->Info->Name); 
+0

ありがとう、私はコードを変更しましたが、不幸なことはありません。 最初の投稿で呼び出しコードを更新しました。 – fsp

+0

はい、VS2015を持っています。私はそれをもう一度貼り付けましたが、今は間違いなくコンパイルするようです。 – fsp

+0

オープニングの質問を更新しました。いくつかのchar *は間違った方向を指しています。 – fsp