Маршалинг типа char** в приложение C#

194
07 апреля 2018, 19:41

Имеется функция в dll, которая создает массив строк внутри себя и возвращает его + количеств элементов по указателю в аргументе(С++):

extern "C" __declspec(dllexport)  char** GetListAdapters(int*);

Как мне импортировать эту функцию в приложении .NET C#? И, что самое важное, получить все значения массива строк?

Answer 1

Моя С++ функция:

char** WINAPI MyCppFunc(int * count)
{
    char** result = new char*[3];
    result[0] = "qwerty";
    result[1] = "1234567890";
    result[2] = "!";
    *count = 3;
    return result;
}

.NET импорт:

[DllImport("CppDll.dll")]
public static extern IntPtr MyCppFunc(ref int count);

И получение массива строк:

int count = 0;
IntPtr ptr = MyCppFunc(ref count);
string[] result = new string[count];
for (int i = 0; i < count; i++)
{
    IntPtr charPtr = Marshal.ReadIntPtr(ptr + i * Marshal.SizeOf<IntPtr>());
    result[i] = Marshal.PtrToStringAnsi(charPtr);
}

Вам нужно будет узнать точное имя экспортируемой функции (в моем примере через def файл они совпадают), например, через утилиту dumpbin. Она идет вместе со студией.

READ ALSO
ClickOnce смена url установки

ClickOnce смена url установки

Добрый деньВ ClickOnce пытаюсь консольно сменить Installation Folder

189
Установка WPF Themes

Установка WPF Themes

Скачал стили панели элементов windows form C# для visual studio, но не знаю куда кидать файлыКачал отсюда-->WPF Themes

149
Как создать универсальный класс

Как создать универсальный класс

Подскажите пожалуйста! Я в DataSet ResultData гружу данные из БДА затем выбираю их в массив, который потом прикручиваю к комбобоксу в качестве источника...

199
Отрисовка фигуры в pictureBox

Отрисовка фигуры в pictureBox

Пытаюсь нарисовать многоугольник внутри pictureBox1, но он не выводится, ниже приведет листинг, что я делаю не так или же как правильно вызвать...

197