2012-04-23 54 views
3

我有C++中的DLL,它返回列表,我想用它在我的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

'的std ::列表<>'和'系統.Collections.Generic.List <>'是不相同的儘可能的方式。除非您編寫C++/CLI shim,否則您的C++代碼只需要按照POD類型工作 - 返回標準庫對象永遠不會起作用。 – ildjarn 2012-04-23 22:49:54

+1

相反的問題(編組和從C#傳遞給C++的列表)已經被問到[這裏](http://stackoverflow.com/q/6532923/960195),並且可能會有幫助。 – 2012-04-23 22:50:08

+0

我認爲你可以做這種編組的唯一方法是編寫一個C++/CLI中間函數來執行「手動」轉換。 – 2012-04-23 22:51:46

回答

3

每賈裏德杆數:

泛型作爲一個規則,任何不支持互操作場景。如果您嘗試編制泛型類型或值,則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); 
    }