使用P-Invoke将托管C#中的字符串数组传递给非托管函数

时间:2011-09-27 13:34:18

标签: c# .net pinvoke marshalling unmanaged

是否可以使用P-Invoke将托管C#中的字符串数组传递给非托管函数?

这很好用:

[DllImport("LibraryName.dll")]
private static extern void Function_Name(string message);

虽然这个:

[DllImport("LibraryName.dll")]
private static extern void Function_Name(string[] message);

失败
  

未处理的异常:System.NotSupportedException:NotSupportedException

我尝试使用MarshalAs但没有运气([MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPWStr)] String[] dataToLoadArr)

是否可以通过这种方式传递字符串数组?

1 个答案:

答案 0 :(得分:1)

[DllImport(Library)]
private static extern IntPtr clCreateProgramWithSource(Context context,
                                                       cl_uint count,
                                                       [In] [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr, SizeParamIndex = 1)] string[] strings,
                                                       [In] [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.SysUInt, SizeParamIndex = 1)] IntPtr[] lengths,
                                                       out ErrorCode errcodeRet);
public static Program CreateProgramWithSource(Context context,
                                                 cl_uint count,
                                                 string[] strings,
                                                 IntPtr[] lengths,
                                                 out ErrorCode errcodeRet)

这在我的OpenCL库OpenCL.NET(http://openclnet.codeplex.com/SourceControl/changeset/view/94246#1251571)中运行良好。请注意,我也使用SizeParamIndex传递计数。