c#,使用单个函数

时间:2015-10-11 13:19:49

标签: c# c++ arrays pointers interop

目前我在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指针的大小始终与数组指针的大小相同。

0 个答案:

没有答案