我有两个结构的以下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 ++的例子。
更新:
我在从NineBerry进行更改后尝试访问以下内容:
public unsafe static CustomerList* ListCustomer()
{
CustomerList* c = _ListCustomer(Init());
Console.Write("customer list: " + (int)c);
string name = new string(c->Info->Name);
return c;
}
这导致了这个错误:
CS0193 The * or -> operator must be applied to a pointer
更新#2:
使用NineBerrys方法我得到它以某种方式工作,但指针似乎指向错误的方向。
我打印出姓名,地址和身份证明:
Name ???????t??\P???????????
adr ?????????????2?????????????
Id ????????????????????????????C:\WINDOWS\SYSTEM32\VCRUNTIME140D.dll
Name ???????t??N
adr ?????????????2???????
Id ???????????????????????▒????????
这些是结果。
答案 0 :(得分: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);