目前我在C#端使用以下定义
[DllImport("CL", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr bufferWrite(IntPtr handle,float[] obj);
将一个float数组发送到c ++ dll中的C空间,如下面的定义
__declspec(dllexport)
void bufferWrite(OpenClBuffer * handle, void * ptr)
{
...
}
它有效(或似乎工作)。现在我也需要支持double,long和byte数组。另外我不想在c ++ dll中重写其他函数,因为它已经使用了void指针,缓冲区的大小由其他一些参数处理。
使用" ref object obj"是否合法?而不是" float [] obj"或者" long [] obj"在所有平台的C#空间(32位,64位,xp,7,8.1,10),如下所示
[DllImport("CL", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr bufferWrite(IntPtr handle,ref object obj);
或者我是否需要在c ++中添加额外的功能,例如
[DllImport("CL", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr bufferWriteFloat(...);
[DllImport("CL", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr bufferWriteInt(...);
[DllImport("CL", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr bufferWriteLong(...);
并让他们使用转换调用相同的旧函数(void *)?也许只是在C#中重载函数就足够了并且100%的时间都可以工作?
[DllImport("CL", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr bufferWrit(..., float[] obj);
[DllImport("CL", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr bufferWrite(..., long[] obj);
[DllImport("CL", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr bufferWrite(..., double[] obj);
我假设当使用C#-C ++ interop时,void指针的大小始终与数组指针的大小相同。