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 关注
- 205 浏览
添加回答
举报