2013-11-22 56 views
3

我有一個庫提供,我知道使用C++。 我導入的DLL作爲這樣:
[DllImport("pst")] private static extern int pst_get_sensor(ref PSTSensor sensor); 的PSTSensor是一個結構,在C++例如,它被定義爲這樣:C#到C++數組?

struct PSTSensor 
{ 
     char name[80];  /**< Device name */ 
     int  id;    /**< Device identifier (for other tracking interfaces */ 
     float pose[16];  /**< Device pose estimate as row-major matrix */ 
     double timestamp;  /**< Time the data was recorded */ 
}; 

的問題是,即除了一個Int和一個雙,它採用了浮動,更重要的是一個數組。一個數組在C#和C++之間有些不同。當使用此結構調用pst_get_sensor(ref sensor);時,運行代碼時整個開發環境會崩潰。

我現在做我的結構在C#這樣的:

struct PSTSensor{ 
     public char[] name; 
     public int id; 
     public float[] pose; 
     public double timestamp; 
    } 

我的問題是,如何創建一個數組,C++的理解,並正確返回?這甚至有可能嗎?

非常感謝提前, 笑臉

回答

6

你的C#結構需要定義一字形排列的長度。並且name字段最好在C#代碼中聲明爲一個字符串。這使您更容易使用它。

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] 
struct PSTSensor 
{ 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] 
    public string name; 
    public int id; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] 
    public float[] pose; 
    public double timestamp; 
} 

struct layout屬性在此處是可選的,因爲它只是重新指定默認值。但是你可以選擇保留它以明確你的意圖。

+0

好吧,讓我們我試試這個。同時。我可能需要閱讀marchalling是什麼,以及unmanagedTypes是什麼(我不用C++編碼,所以這使得這難以理解) – Smileynator

+0

此MSDN主題將有助於:http://msdn.microsoft。 com/en-us/library/s9ts558h(v = vs.110).aspx#cpcondefaultmarshalingforstringsanchor3 –

+0

它的作品,真棒!我決定保留選擇線以備將來參考。感謝一百萬,三位老師不能讓我回答我的問題,我在其他方面看到了編組,但我沒有得到它的作用或如何實現。謝謝! – Smileynator

1

可以使用固定的關鍵字與允許的屬性

unsafe struct PSTSensor 
{ 
    public fixed char name[80]; 
    public int id; 
    public fixed float pose[16]; 
    public double timestamp; 
} 

這將是聲明不安全的代碼選項,並用它傳遞給cpp的功能,你可以這樣調用

unsafe 
{ 
    PSTSensor stSensor = new PSTSensor(); 
    testfunc(stSensor); //function call cpp 
} 
+0

但是現在你的結構使用起來要麻煩得多,而你不得不使用'unsafe'代碼。是的,你可以做到這一點,但你不應該這樣做。 –

+0

我同意不安全,但它是如何更繁重? – kunal

+0

問問你自己如何讀寫固定數組?然後與不使用不安全代碼的變體進行比較。最後,在C#中不是'char'是兩個字節寬。所以你需要使用'固定字節名[80]',你將如何訪問它? –