usar como c# c++ string dllimport

como - ¿Cómo pasar cadenas de C#a C++(y de C++ a C#) usando DLLImport?



como usar dllimport c# (3)

He estado tratando de enviar una cadena a / desde C # a / desde C ++ durante mucho tiempo pero todavía no conseguí que funcionara ...

Así que mi pregunta es simple:
¿Alguien sabe alguna forma de enviar una cadena de C # a C ++ y de C ++ a C #?
(Algún código de ejemplo sería útil)


Pasar la cadena de C # a C ++ debería ser sencillo. PInvoke gestionará la conversión por usted.

Obtener una cadena de C ++ a C # se puede hacer usando un StringBuilder. Necesitas obtener la longitud de la cadena para crear un búfer del tamaño correcto.

Aquí hay dos ejemplos de una conocida API de 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!");


Una gran cantidad de funciones que se encuentran en la API de Windows toman parámetros de tipo cadena o tipo cadena. El problema con el uso del tipo de datos de cadena para estos parámetros es que el tipo de datos de cadena en .NET es inmutable una vez creado, por lo que el tipo de datos StringBuilder es la opción correcta aquí. Para un ejemplo, examine la función API GetTempPath ()

Definición de la API de Windows

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

Prototipo .NET

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

Uso

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


en su código c:

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

en el lado .net:

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

uso:

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