C# 将对象转换为不安全的 void*
C# Convert object to unsafe void*
我正在尝试将 object
转换为不安全的 void*
。这是一个例子:
public static void glBufferData(uint target, ulong size, object data, uint usage)
{
_glBufferData(target, size, data, usage);
}
这里是_glBufferData
的参数:
uint target, ulong size, void* data, uint usage
我正在传递这个对象:
float[] positions =
{
-0.5f, -0.5f,
0.0f, 0.5f,
0.5f, -0.5f
};
我试过了,但没用。
fixed (void* ptr = &data)
{
}
顺便说一句,我的 class 不安全。
我该怎么做?
您不能获取类型为 object
的变量的地址。
将data
参数的类型由object
改为float[]
并使用fixed
获取第一个数组元素的地址:
private static extern void _glBufferData(uint target, ulong size, void* data, uint usage);
public static void glBufferData(uint target, ulong size, float[] data, uint usage)
{
fixed (float* ptr = &data[0])
{
_glBufferData(target, size, ptr, usage);
}
}
您也可以尝试在 _glBufferData
方法的签名中将 void*
更改为 float[]
,这样就无需使用 fixed
:
private static extern void _glBufferData(uint target, ulong size, float[] data, uint usage);
public static void glBufferData(uint target, ulong size, float[] data, uint usage)
{
_glBufferData(target, size, ptr, usage);
}
- 为您的对象创建一个 GCHandle
IntPtr handle = (IntPtr) GCHandle.Alloc(this)
- 将您的句柄解析为 void*
glBufferData(target, size, (void*)handle, usage)
- 从 InPtr GCHandle 恢复您的对象
public static void glBufferData(uint target, ulong size, void* data, uint usage)
{
GCHandle myObjectHandle = (GCHandle)((IntPtr)data);
MyObject obj = (MyObject)myObjectHandle.Target;
}
我正在尝试将 object
转换为不安全的 void*
。这是一个例子:
public static void glBufferData(uint target, ulong size, object data, uint usage)
{
_glBufferData(target, size, data, usage);
}
这里是_glBufferData
的参数:
uint target, ulong size, void* data, uint usage
我正在传递这个对象:
float[] positions =
{
-0.5f, -0.5f,
0.0f, 0.5f,
0.5f, -0.5f
};
我试过了,但没用。
fixed (void* ptr = &data)
{
}
顺便说一句,我的 class 不安全。
我该怎么做?
您不能获取类型为 object
的变量的地址。
将data
参数的类型由object
改为float[]
并使用fixed
获取第一个数组元素的地址:
private static extern void _glBufferData(uint target, ulong size, void* data, uint usage);
public static void glBufferData(uint target, ulong size, float[] data, uint usage)
{
fixed (float* ptr = &data[0])
{
_glBufferData(target, size, ptr, usage);
}
}
您也可以尝试在 _glBufferData
方法的签名中将 void*
更改为 float[]
,这样就无需使用 fixed
:
private static extern void _glBufferData(uint target, ulong size, float[] data, uint usage);
public static void glBufferData(uint target, ulong size, float[] data, uint usage)
{
_glBufferData(target, size, ptr, usage);
}
- 为您的对象创建一个 GCHandle
IntPtr handle = (IntPtr) GCHandle.Alloc(this)
- 将您的句柄解析为 void*
glBufferData(target, size, (void*)handle, usage)
- 从 InPtr GCHandle 恢复您的对象
public static void glBufferData(uint target, ulong size, void* data, uint usage)
{
GCHandle myObjectHandle = (GCHandle)((IntPtr)data);
MyObject obj = (MyObject)myObjectHandle.Target;
}