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);
}
  1. 为您的对象创建一个 GCHandle
IntPtr handle = (IntPtr) GCHandle.Alloc(this)
  1. 将您的句柄解析为 void*
glBufferData(target, size, (void*)handle, usage)
  1. 从 InPtr GCHandle 恢复您的对象
public static void glBufferData(uint target, ulong size, void* data, uint usage)
{
            GCHandle myObjectHandle = (GCHandle)((IntPtr)data);
            MyObject obj = (MyObject)myObjectHandle.Target;
}