Я следующий заголовок 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 ???????????????????????▒????????
Таковы результаты.
Спасибо, но компилятор не кажется, хорошо с ним: 'Не удается получить адрес, получить размер или объявить указатель на управляемый тип ('Bank.CustomerInfo')' – fsp