C#调用本地​​C ++的所有function:使用什么types?

我想从C#项目中创build一个本地C ++。

  • 如果我想从C#传递一个string到C ++中的函数,我应该使用哪个参数?
  • 我知道C#string使用Unicode,所以我尝试了wchar_t *的function,但它不工作; 我尝试捕获被调用函数引发的任何exception,但没有抛出exception。
  • 我也想返回一个string,所以我可以testing它。

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 )