2012-01-06 62 views
2

我有一個從PInvoke返回的結構數組,如果結構只包含int或float,但它返回數組,但是當我嘗試返回數組char它開始變得凌亂,我試圖返回一個IntPtr,但那並沒有成功。任何想法如何我可以得到這個工作?用PInvoke返回一個包含char []的結構數組

C代碼

struct return_part { 
    int partid; 
    int numcomp; 
    int parttype; 
    char partname[100]; 
}; 

extern int return_parts(return_part ** array, int * arraySizeInElements) { 
    int partcount = 0; 
    struct list_part *currentnode; 
    currentnode = head; 
    struct section_list *section; 
    struct return_part *temppart; 

    while (currentnode != NULL) { 
     partcount++; 
     currentnode = currentnode->next; 
    } 

    currentnode = head; 
    *arraySizeInElements = partcount; 

    int bytesToAlloc = sizeof(return_part) * (*arraySizeInElements); 
    return_part * a = static_cast<return_part *>(CoTaskMemAlloc(bytesToAlloc)); 
    *array = a; 

    int q = 0; 
    while (currentnode != NULL) { 
     struct return_part tmp; 
     tmp.partid = currentnode->partid; 
     tmp.numcomp = currentnode->numcomp; 
     strcpy(tmp.partname, currentnode->partname); 
     tmp.parttype = currentnode->parttype; 

     a[q] = tmp; 
     q++; 
     currentnode = currentnode->next; 
    } 

    return 0; 
} 

C#代碼

[StructLayout(LayoutKind.Sequential)] 
public struct return_part { 
    public int partid; 
    public int numcomp; 
    public int parttype; 
    public char partname; 
}; 

internal static class UnsafeNativeMethods 
{ 
    [DllImport(_dllLocation, CallingConvention = CallingConvention.Cdecl)] 
    public static extern int return_parts([MarshalAs(UnmanagedType.LPArray, 
    SizeParamIndex = 1)] out return_part[] array, out int arraySizeInElements); 
} 

public static ReturnPoint[] getpoints(int partid) { 
    return_parts[] parts; 
    int size; 
    int result = UnsafeNativeMethods.return_parts(out parts, out size) 
} 

回答

4

非託管代碼的字符數組只是一個字符串,所以您在這裏有兩個選項。你使用哪一個取決於你在實際需要使用字符數據時如何返回C#-land:

  1. 將它作爲一個數組來編組。見this article用於嵌入到結構數組如何得到整理(編輯:這就需要將ByValArray,不LPArray我最初代表;感謝@Hans):

    [StructLayout(LayoutKind.Sequential)] 
    public struct return_part { 
        public int partid; 
        public int numcomp; 
        public int parttype; 
        [MarshalAs(UnmanagedType.ByValArray, SizeConst=100)] 
        public char[] partname; 
    }; 
    
  2. 元帥它作爲一個字符串。有關如何編組結構中包含的字符串,請參閱this article

    [StructLayout(LayoutKind.Sequential)] 
    public struct return_part { 
        public int partid; 
        public int numcomp; 
        public int parttype; 
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=100)] 
        public string partname; 
    }; 
    
+0

LPArray是不正確的,即它變成字符*,不是char []。第二個片段很好。 – 2012-01-06 15:55:52

+0

第二個工作很好,謝謝。 – user978281 2012-01-06 19:55:48

+0

我的錯誤,你是對的;數組/指針等價僅在函數參數中是真實的,而不是嵌入到結構中。編輯來解決這個問題。 – 2012-01-06 21:15:57

1

在C#的一面,你的結構有一個字符作爲零件名稱。嘗試使用任一:

char[] partname; //-- A character array 

byte[] partname; //-- A byte array 

string partname; //-- A string 

我傾向於喜歡字符串,如果有效。該字節可能工作,因爲C#中的字節與C中的字符更符合邏輯地排列。字符數組也可能工作,因爲C#中的字符在邏輯上表示實際單個字符(預期用途),C實際上並不具有(缺少無符號整數類型)。

相關問題