使用 P-Invoke 将字符串数组从托管 C# 传递到非托管函数

发布于 2024-12-06 11:52:19 字数 587 浏览 6 评论 0原文

是否可以使用 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)

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

Is it possible to pass a string array from managed C# to an unmanaged function using P-Invoke?

This works fine:

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

While this:

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

fails with

Unhandled exception: System.NotSupportedException: NotSupportedException

I have tried using MarshalAs with no luck ([MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPWStr)] String[] dataToLoadArr)

Is it possible to pass string arrays this way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

窝囊感情。 2024-12-13 11:52:19
[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 传递计数。

[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)

This works fine in my OpenCL library, OpenCL.NET (http://openclnet.codeplex.com/SourceControl/changeset/view/94246#1251571). Note that I am passing in the count using SizeParamIndex as well.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文