将byte []从c#传递到plain c dll时发生访问冲突

时间:2014-08-25 12:02:50

标签: c# c dll unity3d access-violation

我试图将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上的访问冲突。

2 个答案:

答案 0 :(得分:1)

尝试Marshal.Copy(Byte[], Int32, IntPtr, Int32)并将指针传递给C调用

答案 1 :(得分:0)

这是一个与传递字节数组完全无关的愚蠢错误。问题是我在没有-force-opengl的情况下启动了Unity(默认情况下我认为是Direct3D),SOIL仅适用于OpenGL。