如何使用DLLImport将字符串从C#传递到C ++(以及从C ++传递到C#)?

我一直在尝试向C ++发送一个字符串到/从C ++发送一个字符串很长一段时间但是没有设法让它工作呢……

所以我的问题很简单:
有没有人知道从C#到C ++以及从C ++到C#发送字符串的方法?
(一些示例代码会有所帮助)

将字符串从C#传递给C ++应该是直截了当的。 PInvoke将为您管理转换。

从C ++到C#的字符串可以使用StringBuilder完成。 您需要获取字符串的长度才能创建正确大小的缓冲区。

以下是众所周知的Win32 API的两个示例:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); public static string GetText(IntPtr hWnd) { // Allocate correct string length first int length = GetWindowTextLength(hWnd); StringBuilder sb = new StringBuilder(length + 1); GetWindowText(hWnd, sb, sb.Capacity); return sb.ToString(); } [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern bool SetWindowText(IntPtr hwnd, String lpString); SetWindowText(Process.GetCurrentProcess().MainWindowHandle, "Amazing!"); 

在您的c代码中:

 extern "C" __declspec(dllexport) int GetString(char* str) { } extern "C" __declspec(dllexport) int SetString(const char* str) { } 

在.net方面:

 using System.Runtime.InteropServices; [DllImport("YourLib.dll")] static extern int SetString(string someStr); [DllImport("YourLib.dll")] static extern int GetString(StringBuilder rntStr); 

用法:

 SetString("hello"); StringBuilder rntStr = new StringBuilder(); GetString(rntStr); 

Windows API中遇到的许多函数都采用字符串或字符串类型参数。 对这些参数使用字符串数据类型的问题是.NET中的字符串数据类型一旦创建就是不可变的,因此StringBuilder数据类型是正确的选择。 有关示例,请检查API函数GetTempPath()

Windows API定义

 DWORD WINAPI GetTempPath( __in DWORD nBufferLength, __out LPTSTR lpBuffer ); 

.NET原型

 [DllImport("kernel32.dll")] public static extern uint GetTempPath ( uint nBufferLength, StringBuilder lpBuffer ); 

用法

 const int maxPathLength = 255; StringBuilder tempPath = new StringBuilder(maxPathLength); GetTempPath(maxPathLength, tempPath);