2016-10-31 3 views
1

Я следующий заголовок C для двух структур:C# импортировать структуру из C DLL

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

Update:

Я попытался к нему доступ следующего после внесения изменений из 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; 
} 

Каких procudes этой ошибки:

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

Update # 2:

Используя подход NineBerrys, я как-то работал, но указатели, похоже, указывают на неправильные направления.

я распечатал имя, адрес и идентификатор:

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

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

Таковы результаты.

+0

Спасибо, но компилятор не кажется, хорошо с ним: 'Не удается получить адрес, получить размер или объявить указатель на управляемый тип ('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

Обновлены начальные вопросы, некоторые символы * указывают на неправильное направление, я думаю. – fsp

Смежные вопросы