Передача массива строк из управляемого C # в неуправляемую функцию с помощью P-Invoke - PullRequest
4 голосов
/ 27 сентября 2011

Можно ли передать массив строк из управляемого C # в неуправляемую функцию с помощью P-Invoke?

Это прекрасно работает:

[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 Ответ

1 голос
/ 13 февраля 2012
[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.

...