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

时间:2012-05-29 12:58:43

标签: c# c++ string dllimport

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

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

3 个答案:

答案 0 :(得分:20)

你的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);

答案 1 :(得分:11)

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

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

以下是众所周知的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!");

答案 2 :(得分:1)

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);