我一直在嘗試創建一個結構類型的句柄,因爲我需要一個釘住指針,但我得到的錯誤「對象包含非原始的或非原始的, blittable數據「我如何分配GCHandle結構當結構包含布爾
我的結構是這樣的:
[StructLayout(LayoutKind.Sequential)]
public struct MyStruct
{
[MarshalAs(UnmanagedType.U1)]
public bool Test;
}
現在,當我打電話,
var mystruct = new MyStruct();
var handle = GCHandle.Alloc(mystruct, GCHandleType.Pinned);
我得到的錯誤」對象包含非基本或非blittable數據」。現在我明白了bool字段是一個非blittable類型。但我的印象是,通過添加MarshalAs屬性,我可以告訴編組人員如何轉換類型。 (我也試過UnmanagedType.Bool
)
這個結構必須在全局範圍內定義,因爲它在整個班級都是需要的。我需要指針的唯一原因是因爲我有一個非託管API,必須將此結構作爲指針傳遞。然後,我必須在回調中獲取該結構並讀取/更新成員。
所以這是基本情況。
- 結構是
- 指向結構得到
- 指向結構傳遞到API
- API調用靜態方法回調,我則需要獲得管理類全球範圍內創建我的結構和閱讀/更新成員。
我試圖用Marshal.StructureToPtr
但這隻能創建一個副本,因此,如果在我的管理類我更新的構件時,在回調上升,更新的價值是不存在的。
有誰知道我怎麼能得到一個固定的指針,我的結構,所以我可以讀/修改公共成員,並讓他們在回調中可用?
謝謝
這裏是Blittable型列表HTTP:/ /msdn.microsoft.com/en-us/library/75dwhxf7.aspx – Mayank 2014-12-27 20:06:20