什么是C#中的void*?

san*_*hah 8 c# c++ visual-c++

我正在查看VC++ 6.00程序的源代码.我需要将此源转换为C#但我无法理解此示例中的(void*)是什么?

glTexImage2D(
     GL_TEXTURE_2D,
     0,
     GL_RGBA8,
     IMAGE_WIDTH,
     IMAGE_HEIGHT,
     0,
     PIXEL_FORMAT,
     GL_UNSIGNED_BYTE,
     (void*)imageData
 );
Run Code Online (Sandbox Code Playgroud)

在此代码中,imagedata是一个指针字节*imageData

Sam*_*ell 19

通常,void*将转换为IntPtrC#代码.

使用更多信息进行编辑:IntPtr在.NET/C#中,通常表现得像一个不透明的句柄.你不能直接取消引用它,从它获取"大小"信息(例如你指向的数组的大小),它不会试图告诉你它指向的数据类型 - 或者即使它是指针.当你将C/C++代码翻译成C#并且你看void*,C#代码应该被编写,IntPtr直到你更清楚你正在处理什么.

pinvoke.net网站有两个条目glTexImage2D,具体取决于图像数据的存储位置.如果图像数据存储在byte[].NET/C#中的托管中,则调用通过的版本byte[].如果图像数据存储在非托管内存中,并且只有IntPtrC#代码中的数据,则调用通过的版本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);
Run Code Online (Sandbox Code Playgroud)


Ada*_*lls 7

它最典型的是IntPtr在C#中.

以下是如何从C#调用此函数的示例:

Bitmap bitmap = new Bitmap("blah");
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, 4, bitmap.Width, bitmap.Height, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, bitmap.Scan0);

if(bitmap != null) {
    bitmap.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

资料来源:http://www.gamedev.net/topic/193827-how-to-use-glglteximage2d--using-csgl-library-in-c/

如果您拥有的是byte[]包含有效图像的图像,则可以将其加载到位图中:

public static Bitmap BytesToBitmap(byte[] byteArray)
{
    using (MemoryStream ms = new MemoryStream(byteArray))
    {
        Bitmap img = (Bitmap)Image.FromStream(ms);
        return img;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果给你的麻烦,或者你的数据不是东西,在Win32库可以处理,你可以使用元帅给你一个IntPtr从byte[]直接.

IntPtr unmanagedPointer = Marshal.AllocHGlobal(bytes.Length);
Marshal.Copy(bytes, 0, unmanagedPointer, bytes.Length);

// Call your function here, passing unmanagedPointer to it

Marshal.FreeHGlobal(unmanagedPointer);
Run Code Online (Sandbox Code Playgroud)

来自: 如何从C#中的byte []获取IntPtr


Sam*_*ica 2

它正在转换imageData为类型(void*),所以基本上告诉编译器获取这个值并将其视为一个(void*)

根据我的经验,void*是一个指向非特定类型的指针。


至于将示例转换为 C#,那么您实际上不必太担心 C++ 中的内容如何转换。只需确保将正确的类型传递给相应的 C# 函数即可。