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

我正在编写一个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)); 

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

 delegate void MyDelegate([MarshalAs(UnmanagedType.LPWStr)] StringBuilder foo) StringBuilder sb = new StringBuilder(64); // reserve 64 characters. del(sb); 

如果你想使用CharSet或诸如此类的东西,请参见鲜为人知的UnmanagedFunctionPointer属性,它类似于委托的DllImport