2012-10-29 108 views
1

我有一些C代碼,將使用P/Invoke從C#調用。我有一個C結構成員,我試圖定義一個C#等價物。無符號字符數組指針指向C#

Array16 *data; 

Array16被定義爲

typedef unsigned char Array16[16]; 

如何定義的C#相當於這個C數據成員的?

+0

聲明爲'IntPtr',用手當元帥的有效載荷確保您解除分配內存。 –

+0

取決於。你需要訪問ptr中的數據嗎?使用字節*。你不?使用IntPtr。 –

+0

@大衛 - 我該如何執法? –

回答

0

C#中最接近C++無符號字符的類型是字節。

+0

我如何在我的情況下達到相同的效果,這不是簡單的無符號字符,而是指向無符號字符數組的指針? –

+2

雖然這是事實,但在這裏並沒有真正的用處。 –

1

我猜你的C結構看起來是這樣的:

struct MyStruct { 
    Array16 *data; 
}; 

由於參考的有效載荷的,我不相信你可以得到的P/Invoke封送做的工作適合你。你需要手工編組。

在C#代碼聲明這樣

[StructLayout(LayoutKind.Sequential)] 
public struct MyStruct 
{ 
    IntPtr data; 
} 

的結構當你需要一個函數調用編寫這樣一個結構做到這一點:

MyStruct s; 
s.data = Marshal.AllocHGlobal(16); 
byte[] bytes = Encoding.Default.GetBytes("some string data"); 
Marshal.Copy(bytes, 0, s.data, Math.Min(16, bytes.Length)); 

如果您需要讀取的數據是由你的功能返回,使用相反的方向相同的策略。

int nbytes = ... // probably returned by the function, no more than 16 
byte[] bytes = new bytes[nbytes]; 
Marshal.Copy(s.data, bytes, 0, nbytes); 
string returnedString = Encoding.Default.GetString(bytes); 

當你與結構完成後通過調用

Marshal.FreeHGlobal(s.data);