1 回答

TA貢獻1798條經驗 獲得超7個贊
只要您不想修改數據,就可以安全地將數據包裝為 void * 或 IntPtr。您通過 AllocHGlobal 分配數據,后者通過 LocalAlloc 從本地進程堆返回數據,最終調用 RtlAllocateHeap。對于 C#,該指針是一個黑盒子,永遠不會寫入或修改它。只要您不提前釋放數據,一切都會好起來的。
C 編程規則適用:您需要手動管理內存,并注意誰擁有數據以及誰負責刪除它。
只有當您嘗試將該指針映射到部分嘗試授予對某些字段的訪問權限的托管類時,才會出現問題。然后您需要注意結構成員對齊方式與 C 頭文件中的對齊方式相同,并且您需要為要跳過的數據獲取正確的偏移量。然后,您可以將 IntPtr 轉換為 C# 結構,作為帶有不安全代碼的指針,如果您得到正確的偏移量和對齊,它應該可以工作。
如果 C++ 類是包含 STL 數據類型的頭文件的一部分,情況就完全不同了。這些東西根本不是可包裝的,因為成員對齊取決于您當前編譯器的隨附 STL 版本,這在私有成員字段之間強加了一個緊密的合同,可以在 C++/STL 版本之間更改。為此,您需要一個 C 包裝器,它將輔助方法包裝為普通的 C 方法,具有內部調用 C++ 方法的常用結構。托管 C++ 是一種相當過時的技術,不應再使用。
總結一下:您目前的方法很好,并且會奏效。如果您想從字節 blob 訪問修改數據,這將變得更加工作,但是一旦您知道如何在 C# 中聲明僅包含原始類型(沒有字符串、字典或指向托管堆結構的指針)的包裝器結構,這也是可行的。
- 1 回答
- 0 關注
- 189 瀏覽
添加回答
舉報