C#从C DLL导入结构

时间:2016-10-31 00:46:46

标签: c# c dll struct

我有两个结构的以下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      ???????????????????????▒????????

这些是结果。

1 个答案:

答案 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);