我有一个带有一些很好的函数的“本机”DLL,可以返回(并接受)指向数据的指针,这些数据是根据特定的C结构格式化的。
在我的C#程序中,我不关心struct的内部结构,我只是希望得到并将它们传递给本机函数。我已经设法在DLL内部调整函数。 对于指针,我已经想过使用void *(作为“指向未知的指针”),因为我真的不关心指向结构的内部字段,我只需要存储并使用指针传递它到DLL库函数。
但是对于许多不同类型的数据使用void *会使我的代码无法读取!在C#中有什么方法可以使用typedef void * some_nicer_type_t吗?或者做那样的事情?
答案 0 :(得分:2)
您可以考虑改用IntPtr
。
来自MSDN:
使用的特定于平台的类型 表示指针或句柄。
这最终可能会帮助您编写非unsafe
代码。
修改强>
为了满足您对此问题的评论所重申的需求,我可能建议的一件事(虽然不建议这是理想的)是定义struct
或class
本质上是一个包装器在指针周围:
public struct TypedPointer
{
public IntPtr UnderlyingPointer;
}
当你自己提出时,这可能会导致包装更多代码,以使其全部符合你想要的使用和美学。
答案 1 :(得分:1)
IntPtr的
是要走的路 只有你需要注意的区域是内存管理。不安全或不安全 - C#需要一个引用,否则它将迟早被垃圾收集 - 当其中一个外部dll使用它时也可能。因此,您需要确保在C#端根据需要保留对IntPtr的引用。