我试图将SOIL库用于我的Unity3d项目。我稍微修改了代码,将其编译为DLL。 我有一个带签名的C函数:
__declspec(dllexport)
unsigned int SOIL_load_OGL_texture_from_memory
(
const unsigned char *const buffer,
int buffer_length,
int force_channels,
unsigned int reuse_texture_ID,
unsigned int flags
);
我在我的c#脚本中声明了它:
[DllImport("SOIL", CallingConvention = CallingConvention.Cdecl)]
private static extern uint SOIL_load_OGL_texture_from_memory(
System.IntPtr buffer,
int buffer_length,
int force_channels,
uint reuse_texture_ID,
uint flags);
尝试致电:
GCHandle pinnedArray = GCHandle.Alloc(bytes, GCHandleType.Pinned);
System.IntPtr pointer = pinnedArray.AddrOfPinnedObject();
uint id = SOIL_load_OGL_texture_from_memory(pointer, bytes.Length, 3, 0, 0);
pinnedArray.Free();
并获得访问冲突。所以我尝试将 IntPtr 作为 const unsigned char * 传递。也许我需要使用与GCHandle不同的东西?
编辑:在播放模式下崩溃整个Unity 3D:MSVCR120.dll上的访问冲突。
答案 0 :(得分:1)
尝试Marshal.Copy(Byte[], Int32, IntPtr, Int32)
并将指针传递给C调用
答案 1 :(得分:0)
这是一个与传递字节数组完全无关的愚蠢错误。问题是我在没有-force-opengl的情况下启动了Unity(默认情况下我认为是Direct3D),SOIL仅适用于OpenGL。