我有一些C代碼,將使用P/Invoke從C#調用。我有一個C結構成員,我試圖定義一個C#等價物。無符號字符數組指針指向C#
Array16 *data;
Array16被定義爲
typedef unsigned char Array16[16];
如何定義的C#相當於這個C數據成員的?
我有一些C代碼,將使用P/Invoke從C#調用。我有一個C結構成員,我試圖定義一個C#等價物。無符號字符數組指針指向C#
Array16 *data;
Array16被定義爲
typedef unsigned char Array16[16];
如何定義的C#相當於這個C數據成員的?
C#中最接近C++無符號字符的類型是字節。
我如何在我的情況下達到相同的效果,這不是簡單的無符號字符,而是指向無符號字符數組的指針? –
雖然這是事實,但在這裏並沒有真正的用處。 –
我猜你的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);
聲明爲'IntPtr',用手當元帥的有效載荷確保您解除分配內存。 –
取決於。你需要訪問ptr中的數據嗎?使用字節*。你不?使用IntPtr。 –
@大衛 - 我該如何執法? –