从C++;要由C#调用,函数的参数包括宽字符字符串(LPCWSTR) 我正在编写一个C库,供本地C++应用程序使用。我使用C++/CLI作为互操作性机制 要求将回调函数从C++传递到C(以C++/CLI为中间层)。C.*库需要调用具有零结尾的宽字符串的C++函数;i、 e.回调函数的原型是

从C++;要由C#调用,函数的参数包括宽字符字符串(LPCWSTR) 我正在编写一个C库,供本地C++应用程序使用。我使用C++/CLI作为互操作性机制 要求将回调函数从C++传递到C(以C++/CLI为中间层)。C.*库需要调用具有零结尾的宽字符串的C++函数;i、 e.回调函数的原型是,c#,callback,c++-cli,unmanaged,wchar,C#,Callback,C++ Cli,Unmanaged,Wchar,Func(LPCWSTR pszString) 还有其他参数,但它们对本次讨论并不重要 我搜索了网络,找到了Marshal.GetDelegateForFunctionPointer方法,我可以使用它。问题是它将System.String从C#转换为char*,而不是我正在寻找的wchar#t* 另外,如果可能的话,实现这个代码示例(包括C++/CLI部分)的最佳方法是什么。 C++/CLI dll依赖于C#dll。方法需要同步调用。GetDelegateForFunctionPointer将起

Func(LPCWSTR pszString)

还有其他参数,但它们对本次讨论并不重要

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

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

GetDelegateForFunctionPointer
将起作用,但您需要向委托声明中的参数添加
[MarshalAs(UnmanagedType.LPWStr)]
属性,以便将
字符串
转换为
wchar\u 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);

如果您想使用
字符集
或诸如此类的东西,请参见鲜为人知的属性,它与委托类似。

+1出于好奇,是否无法像使用DLLImport一样声明委托具有
字符集=字符集。Unicode
。非常感谢。你的回答实际上解决了我的问题。如何实现以下第二个要求:delegate void MyDelegate([Marshallas(UnmanagedType.LPWStr)]string foo,out string val1,out int val2);换言之,C语言调用回调,给出一个字符串参数,而C++中,基于该字符串参数,Val1和Val2需要传递回C*@ @ AnIL:对于<代码> LPSRt< /COD>和 LPWSTR < /Cord>输出参数,在P/UncKE中,使用<代码> StringBuilder < /C> >,本,请您提供一个例子,如科丽所做的。我不熟悉C#和C++/CLI世界。@David:是的,确实有,请看我的答案。:-)