gpt4 book ai didi

c# - 从 C++ 传递函数指针以供 C# 调用 - 函数的参数包括一个宽字符字符串 (LPCWSTR)

转载 作者:行者123 更新时间:2023-11-30 13:50:29 31 4
gpt4 key购买 nike

我正在编写一个 C# 库以供 native C++ 应用程序使用。我使用 C++/CLI 作为互操作性机制。

我需要将回调函数从 C++ 传递到 C#(使用 C++/CLI 作为中间层)。 C# 库需要用零终止的宽字符字符串调用 C++ 函数;即回调函数的原型(prototype)是

函数(LPCWSTR pszString);

还有其他参数,但它们对本次讨论无关紧要。

我搜索了网络并找到了我可以使用的 Marshal.GetDelegateForFunctionPointer 方法。这个问题是它将 System.String 从 C# 转换为 char* 而不是我正在寻找的 wchar_t*。

此外,如果可能的话,实现此代码示例(包括 C++/CLI 部分)的最佳方法是什么。C++/CLI dll 依赖于 C# dll。方法需要同步调用。

最佳答案

GetDelegateForFunctionPointer 可以工作,但是您需要将 [MarshalAs(UnmanagedType.LPWStr)] 属性添加到委托(delegate)声明中的参数,以便 String 转换为 wchar_t*:

delegate void MyDelegate([MarshalAs(UnmanagedType.LPWStr)] string foo)

IntPtr func = ...;
MyDelegate del = (MyDelegate)Marshal.GetDelegateForFunctionPointer(func,
typeof(MyDelegate));

要传递一个可修改 字符串,请提供一个StringBuilder。您需要为非托管函数显式保留空间才能使用:

delegate void MyDelegate([MarshalAs(UnmanagedType.LPWStr)] StringBuilder foo)

StringBuilder sb = new StringBuilder(64); // reserve 64 characters.

del(sb);

关于c# - 从 C++ 传递函数指针以供 C# 调用 - 函数的参数包括一个宽字符字符串 (LPCWSTR),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6282264/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com