Как я могу перечислить список <int>?

89
9

У меня есть dll в С++, он возвращает список, я хочу использовать его в моем приложении С# в виде списка


[DllImport("TaskLib.dll", SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern List<int> GetProcessesID();

public static List<int> GetID()
{
List<int> processes = GetProcessesID();//It is impossible to pack a "return value": The basic types can not be packed
//...
}

спросил(а) 2021-01-19T14:53:13+03:00 6 месяцев назад
1
Решение
89

Пер Джаред Пар:


Обычно генераторы не поддерживаются в любом сценарии взаимодействия. И PInvoke, и COM Interop не удастся, если вы попытаетесь маршалировать общий тип или значение. Следовательно, я ожидал бы, что Marshal.SizeOf будет непроверен или не поддерживается для этого сценария, поскольку это определенная функция маршала.


См:
Маршрутизация общих типов .NET

ответил(а) 2021-01-19T14:53:13+03:00 6 месяцев назад
64

один из возможных сценариев


С++ сторона


    struct ArrayStruct
{
int myarray[2048];
int length;
};

extern "C" __declspec(dllexport) void GetArray(ArrayStruct* a)
{
a->length = 10;
for(int i=0; i<a->length; i++)
a->myarray[i] = i;
}

С# сторона


    [StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct ArrayStruct
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2048)]
public int[] myarray;
public int length;
}

[DllImport("TaskLib.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void GetArray(ref ArrayStruct a);

public void foo()
{
ArrayStruct a = new ArrayStruct();
GetArray(ref a);
}

ответил(а) 2021-01-19T14:53:13+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема