一般而言,void*
在 C# 代码中会被转换为 IntPtr
。
补充更多信息:在 .NET/C# 中,IntPtr
常常表现得像一个不透明的句柄。你不能直接取消引用它,也无法从它那里获取“大小”信息(例如指向哪个数组的大小),它也不会告诉你它指向的数据类型——甚至不知道它是否是指针。当你将 C/C++ 代码翻译成 C# 代码时,如果遇到了 void*
,应该使用 IntPtr
直到你更清楚地了解正在处理的内容。
pinvoke.net 网站为 glTexImage2D
提供了两个条目,具体取决于图像数据存储的位置。如果图像数据存储在 .NET/C# 中的托管 byte[]
中,则调用传递 byte[]
的版本。如果图像数据存储在非托管内存中,并且在 C# 代码中只有 IntPtr
对其数据进行操作,则调用传递 IntPtr
的版本。
来自于 pinvoke.net opengl32 的例子:
[DllImport(LIBRARY_OPENGL)] protected static extern void glTexImage2D (
uint target,
int level,
int internalformat,
int width,
int height,
int border,
uint format,
uint type,
byte[] pixels);
[DllImport(LIBRARY_OPENGL)] protected static extern void glTexImage2D (
uint target,
int level,
int internalformat,
int width,
int height,
int border,
uint format,
uint type,
IntPtr pixels);
void*
可以是任何东西。它应该根据上下文进行翻译 - 在您的情况下可能是byte[]
。 - Konrad Rudolph