@kot220487

Как реализовать передачу строк в C++ dll, изменить ее и вернуть в .Net C# проект?

Есть проект на C#, к нему идёт dll на плюсах. Надо передать строку из C# в функцию либы, в которой ее изменить (дописать/удалить символ) и вернуть обратно. В сети собирал информацию на эту тему, решения не нашел. Тут нашел это toster.ru/q/58640, но это лишь передача строки из либы в C#.
Было бы замечательно, если ответом на мой вопрос будет пример кода, в котором, на стороне C# вызываем функцию либы с двум параметрами (строками), в С++ их соединяем, возвращаем в C# и выводим на экран.
  • Вопрос задан
  • 5515 просмотров
Решения вопроса 1
@Sumor
Для описания и вызова функций из обычных dll на c/c++ используется класс Marshal.
Можно выделить память, преобразовать строку, структуру в неуправляемую память и обратно.
В примере вызывается функция GetComputerName, которая заполняет выделенную в программе память, а затем результат преобразуется в string и выводится на консоль.
class Program
{
    static void Main(string[] args)
    {
        // Выделение памяти из неуправляемой области
        // Получаем обычный указатель для использования в c/c++ функциях
        var pComputerName = Marshal.AllocHGlobal(256);
        // Вызываем описанную внешнюю функцию
        // Она будет работать непосредственно с памятью по указателю
        int size = 256;
        GetComputerName(pComputerName, ref size);
        // Переводим результат в управляемый вид
        var str = Marshal.PtrToStringUni(pComputerName);
        Console.WriteLine(str);
        // Обязательно освобождаем выделенную память
        Marshal.FreeHGlobal(pComputerName);
        Console.ReadLine();
    }

    [DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
    public static extern void GetComputerName(IntPtr pComputerName, ref int size); 
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы