私は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をプリントアウト。
ありがとうございましたが、コンパイラはそれでOKではないようです。 'アドレスの取得、サイズの取得、またはマネージ型へのポインタの宣言( 'Bank.CustomerInfo') ' – fsp