Ogólnie rzecz biorąc, void*
zostanie przekonwertowany na IntPtr
w kodzie C#.
Edytuj nieco więcej informacji: IntPtr
w .NET/C# często zachowuje się jak nieprzezroczysty uchwyt. Nie możesz go bezpośrednio usunąć, uzyskać od niego informacji o "rozmiarze" (np. Rozmiar tablicy, na którą wskazujesz) i nie próbujesz powiedzieć, jakiego typu danych wskazuje - lub nawet jeśli jest to wskaźnik w ogóle. Podczas tłumaczenia kodu C/C++ do C# i widzisz void*
, kod C# powinien być napisany z IntPtr
, dopóki nie będziesz miał lepszego pojęcia, z czym dokładnie masz do czynienia.
Witryna pinvoke.net ma dwa wpisy dla glTexImage2D
, w zależności od miejsca przechowywania danych obrazu. Jeśli dane obrazu są przechowywane w zarządzanym byte[]
w .NET/C#, wywołuje się wersję, która przechodzi przez byte[]
. Jeśli dane obrazu są przechowywane w pamięci niezarządzanej, a do danych w kodzie C# jest tylko , wywołuje się wersję, która przechodzi przez IntPtr
.
Przykłady z 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 *' może być dowolne. To, co powinno być tłumaczone, zależy od kontekstu - w twoim przypadku prawdopodobnie 'byte []'. –