none
Как при использовании DllImport передать строку в правильном формате RRS feed

  • Вопрос

  • Доброго времени суток. Пытаюсь использовать libshout.dll. При указании параметров методу возникает ошибка. Неправильно работаю со строками. Как передать string в метод который принимает char *

    [DllImport("libshout-3.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]

    private static extern int shout_set_host(long instance, string host);


    Сам метод на Си:

    int shout_set_host(shout_t *self, const char *host)

    Что интересно. я понял как правильно получить строку в методе который возвращает char *:

    [DllImport("libshout-3.dll" , CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]       
    internal static extern IntPtr shout_get_error(long instance);
     
    //вот так преобразовываем в строку
    return Marshal.PtrToStringAnsi(shout_get_error(this.instance))



    8 декабря 2016 г. 11:50

Ответы

  • Надо правильно указать CharSet. Конечно же это будет не Unicode так как метод работает с 8 битными символами char (а не с 16 битными WCHAR). Скорее всего эта кодировка - Ansi. Конкретная кодовая страница будет определена настройками ОС.

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


    This posting is provided "AS IS" with no warranties, and confers no rights.

    8 декабря 2016 г. 16:53
    Модератор

Все ответы

  •  "Как передать string в метод который принимает char *" 

    https://msdn.microsoft.com/ru-ru/library/ac7ay120(v=vs.110).aspx - эта страница утверждает, что просто String можно юзать. 


    Думаю, надо вместо long instance сделать IntPtr instance


    • Изменено VadimTagil 9 декабря 2016 г. 9:03 опечатка
    8 декабря 2016 г. 12:07
  • Надо правильно указать CharSet. Конечно же это будет не Unicode так как метод работает с 8 битными символами char (а не с 16 битными WCHAR). Скорее всего эта кодировка - Ansi. Конкретная кодовая страница будет определена настройками ОС.

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


    This posting is provided "AS IS" with no warranties, and confers no rights.

    8 декабря 2016 г. 16:53
    Модератор