Ani*_*dia 3 c# unmanaged c++-cli callback wchar
我正在编写一个C#库,供本机C++应用程序使用.我使用C++/CLI作为互操作性机制.
我需要将回调函数从C++传递给C#(使用C++/CLI作为中间层).C#库需要使用零终止的宽字符串来调用C++函数; 即回调函数的原型是
Func(LPCWSTR pszString);
还有其他参数,但它们对于这个讨论并不重要.
我搜索网,发现Marshal.GetDelegateForFunctionPointer方法,我可以使用.这个问题是它将System.String从C#转换为char*而不是我正在寻找的wchar_t*.
此外,如果可能的话,实现此代码示例的最佳方法是什么,包括C++/CLI部分.C++/CLI dll依赖于C#dll.方法需要同步调用.
GetDelegateForFunctionPointer将工作,但您需要[MarshalAs(UnmanagedType.LPWStr)]在委托声明中的参数中添加一个属性,以便String转换为wchar_t*:
delegate void MyDelegate([MarshalAs(UnmanagedType.LPWStr)] string foo)
IntPtr func = ...;
MyDelegate del = (MyDelegate)Marshal.GetDelegateForFunctionPointer(func,
typeof(MyDelegate));
Run Code Online (Sandbox Code Playgroud)
要传递可修改的字符串,请给出一个StringBuilder.您需要为非托管函数显式保留空间以使用:
delegate void MyDelegate([MarshalAs(UnmanagedType.LPWStr)] StringBuilder foo)
StringBuilder sb = new StringBuilder(64); // reserve 64 characters.
del(sb);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3319 次 |
| 最近记录: |