Dot-Net
使用 P/Invoke 編組結構時如何忽略欄位
我想編組一個用於 P/Invoke 的結構,但是這個結構包含一個只與我的託管程式碼相關的欄位,所以我不希望它被編組,因為它不屬於本機結構。甚至可能嗎?我正在尋找類似於
NonSerialized序列化的屬性,但它似乎不存在……struct MyStructure { int foo; int bar; [NotMarshaled] // This attribute doesn't exist, but that's the kind of thing I'm looking for... int ignored; }任何建議將不勝感激
沒有辦法讓 CLR 忽略一個欄位。相反,我會使用兩個結構,並且可能使一個成為另一個的成員。
struct MyNativeStructure { public int foo; public int bar; } struct MyStructure { public MyNativeStruct native; public int ignored; }
兩種方法:
- 使用類而不是結構:結構總是通過指向 Windows API 或其他本機函式的指針傳遞。用呼叫替換
doThis(ref myStruct)呼叫doThis([In, Out] myClass)應該可以解決問題。完成此操作後,您可以簡單地使用方法訪問您的非編組欄位。- 正如我已經說過的,結構(幾乎)總是通過引用傳遞:因此,被呼叫者對結構維度一無所知:簡單地將附加欄位留在最後一個欄位怎麼樣?當呼叫需要結構指針和結構大小的本機函式時,只需謊報其大小,給出沒有額外欄位的情況。我不知道在從本機函式中獲取這種結構時,將其編組回來是否合法。附帶問題:Marshaller 是否處理標記為私有的類欄位?(我希望不是…)