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

问题描述 投票:0回答:3

我很长一段时间以来一直尝试在 C# 和 C++ 之间发送字符串,但尚未成功...

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

c# c++ string dllimport
3个回答
21
投票

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

13
投票

将字符串从 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!");

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);
© www.soinside.com 2019 - 2024. All rights reserved.