Подтвердить что ты не робот

Как передать строки с С# на C++ (и с C++ на С#) с помощью DLLImport?

Я пытался отправить строку в/из С# в/из C++ в течение длительного времени, но мне пока не удалось ее запустить...

Поэтому мой вопрос прост:
Кто-нибудь знает, как отправить строку с С# на C++ и с C++ на С#?
(Некоторый пример кода был бы полезен)

4b9b3361

Ответ 1

Передача строки из С# в C++ должна быть прямой. PInvoke будет управлять конверсией для вас.

Строка Geting от C++ до С# может быть выполнена с помощью StringBuilder. Вы должны получить длину строки, чтобы создать буфер нужного размера.

Вот два примера хорошо известного API Win32:

[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

в вашем 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);

Ответ 3

Многие функции, встречающиеся в Windows API, принимают строковые или строковые параметры. Проблема с использованием строкового типа данных для этих параметров заключается в том, что строковый тип данных в.NET неизменен после создания, поэтому тип данных StringBuilder является правильным выбором здесь. В качестве примера рассмотрим функцию API GetTempPath()

Определение API Windows

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