微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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 []?

当P /调用dlopen时SIGSEGV

如何在PowerShell中使用HTML Tidy .NET DLL封装器?

Visual Studio ClickOnce部署是否自动包含必要的.NET框架?

使用WaitOne命名互斥体为IPC时,是否可以使用空的while代码块?

.NET核心,Windows Nano服务器和System.Management.Automation

如何获取.NET 2.0中的Environment.SpecialFolders.MyVideo文件夹?

向后兼容WPF应用程序创build使用点networking框架4.5

我们可以从共享path运行batch file(.bat)吗?

在Windows窗体中认button命中(试图find最好的解决scheme)

一个exe部署Windows Forms应用程序

我可能会做一个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 )

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐