我想从C#项目中创build一个本地C ++。
C ++函数如下:
DECLDIR wchar_t * setText(wchar_t * allText) { return allText; }
C#代码如下:
[DllImport("firstDLL.Dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)] public static extern string setText(string allText); var allText= new string('c',4); try { var str1 = setText(allText); } catch (Exception ex) { var str2 = ex.Message; }
我应该使用什么types的C ++函数的返回types,以便我可以从C#调用它返回types的string[]
? 相同的Q,但在C#中函数的参数是string []?
我可能会做一个COM BSTR,并避免与混乱的缓冲区分配。 像这样的东西:
C ++
#include <comutil.h> DECLDIR BSTR * setText(wchar_t * allText) { return ::SysAllocString(allText); }
C#
[DllImport(@"firstDLL.dll", CallingConvention = CallingConvention.Cdecl)] [return: MarshalAs(UnmanagedType.BStr)] private static extern string setText(string allText);
BSTR是本地COM字符串类型。 这里使用它的优点是可以使用COM分配器将内存分配到接口的本地端(使用C ++),然后使用相同的分配器在接口的受管理端进行销毁。 P / Invoke编组知道所有关于BSTR并为您处理所有事情。
虽然你可以通过传递缓冲区长度来解决这个问题,但是这会导致相当混乱的代码,这就是为什么我更喜欢BSTR。
关于你的第二个问题,关于P /调用string[]
,我想你会从Chris Taylor的 Stack Overflow的另一个问题的答案中找到你需要的 。
一个非常有用的网站工具和大量的好消息是http://pinvoke.net/
它可能会帮助你。
C ++
void GetString( char* buffer, int* bufferSize );
C#
int bufferSize = 512; StringBuilder buffer = new StringBuilder( bufferSize ); GetString( buffer, ref bufferSize )