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

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.方法需要同步调用.

Cor*_*son 7

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)