2012-04-23 4 views
3

У меня есть библиотеки DLL в C++, он возвращает список, я хочу, чтобы использовать его в моей C# приложение в виде спискаКак я могу объединить список <int>?

[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 
    //... 
} 
+1

'станд :: Список <> и' System .Collections.Generic.List <> 'не похожи на всевозможные способы. Если вы не напишете прокладки C++/CLI, ваш код на C++ должен работать только с точки зрения типов POD - возврат стандартных объектов библиотеки никогда не будет работать. – ildjarn

+1

Противоположный вопрос (сортировка и передача списка с C# на C++) задан здесь [http://stackoverflow.com/q/6532923/960195] и может оказаться полезным. –

+0

Единственный способ, с помощью которого я могу сделать такой маршалинг, - написать промежуточную функцию C++/CLI для выполнения «вручную» преобразования. –

ответ

3

Per Jared Par:

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

См: Marshalling .NET generic types

1

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

C++ сторона

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; 
    } 

C# сторона

[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); 
    } 
Смежные вопросы