12

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

glTexImage2D(
     GL_TEXTURE_2D,
     0,
     GL_RGBA8,
     IMAGE_WIDTH,
     IMAGE_HEIGHT,
     0,
     PIXEL_FORMAT,
     GL_UNSIGNED_BYTE,
     (void*)imageData
 );

在这段代码中 imagedata 是一个指针 byte* imageData

4

7 回答 7

23

通常,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);
于 2013-03-20T15:36:58.663 回答
8

它通常是IntPtrC# 中的一个。

以下是如何从 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();
}

来源: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;
    }
}

如果这给您带来麻烦,或者您的数据不是 Win32 库可以处理的,您可以使用 Marshal 直接为您提供IntPtrfrom a 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);

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

于 2013-03-20T15:37:33.330 回答
3

正如 Jonathan D 在他的数据中所解释的那样,void*C 表示不能直接使用的泛型类型是一种方式。它是 C 实现泛型接口的方式,尽管它在 C# ( System.IntPtr) 中有直接等价物,但您可能想要使用其他东西,因为 C# 有更好的方法来处理泛型数据,并且不确定是否需要在此处传递泛型数据.

由于您将图像数据传递给函数,因此void*在 C# 中表示的有几种可能性:

  • byte[]将原始图像数据传递给函数
  • System.Drawing.Color[,]如果您正在处理更高级别的点数据(不太可能)
  • System.Drawing.Image如果您想在更高级别上处理图像数据;如果你能侥幸逃脱,这可能是个好主意
  • IntPtr如果您有一个低级缓冲区并且该函数在内部将数据传递给 C API 而不自己处理它。

如果没有更多关于如何使用代码以及要翻译哪些部分的信息,就不可能在这里说出您需要哪些类型。

于 2013-03-20T15:50:14.733 回答
2

如前所述, IntPtr是等价的。

您只能在 c#中的不安全上下文中使用指针,例如:

void MyMethod(IntPtr ptr)
{
  unsafe
  {
      var vptr = (void*) ptr;
      // do something with the void pointer
  }
}
于 2013-03-20T15:47:00.677 回答
2

它正在转换imageData为 type (void*),所以基本上告诉编译器采用这个值并将其视为(void*)

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


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

于 2013-03-20T15:36:07.180 回答
1

虚空其实什么都不是,

void 的三种使用方式:

  • 参数:int myFunc(void)-- 该函数不接受任何内容。

  • 返回值:void myFunc(int)-- 函数不返回任何内容

  • 通用数据指针:void* data-- 'data' 是一个指向未知类型数据的指针,不能被取消引用

在这种情况下,它是一个通用数据指针。

于 2013-03-20T15:36:37.020 回答
1

void*是指向未定义类型对象的指针。在 C# 中有多种表示形式:

  1. 作为不安全代码中的未格式化指针
  2. 作为IntPtr,它通常用于在托管和非托管对象之间编组指针。
  3. 至于object未指定但托管的对象。
于 2013-03-20T15:38:58.997 回答