#c# #c #marshalling #char-pointer
#c# #c #сортировка #указатель на символ
Вопрос:
У меня есть DLL, написанная на C . Функция этой DLL похожа на следующий код:
Код на C :
char _H *GetPalette() {
-------Functions body
-------Functions body
return pPaletteString;
}
Теперь я хочу получить строку поддона из этой функции GetPalette() в коде C #.
Как я мог бы получить строку из этой функции? Я пробовал это в коде C #. Но не смог получить правильный результат.
C # код:
[DllImport("cl.dll", EntryPoint = "GetPalette@0", CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr libGetPalette();
public IntPtr GetPalette()
{
return libGetPalette();
}
Наконец, я хочу получить строку, подобную этой
IntPtr result;
result = imgProcess.GetPallet();
string pallet;
pallet = Marshal.PtrToStringAnsi(result);
MessageBox.Show(pallet);
Этот код не работает должным образом.
Может ли мне помочь какой-нибудь текст, пожалуйста, Как я мог бы получить строковое значение из моей DLL-функции C ?
Спасибо
Shahriar
Комментарии:
1. Хорошей практикой является определение того, какую ошибку или поведение вы получаете. Как мы можем узнать, что означает «Этот код не работает должным образом»?
2. У меня есть символы ‘—>’ из этого кода. Но оно должно возвращаться как ‘473757.473767.574767………….’ строка.
Ответ №1:
Вы можете определить свою функцию C в коде C # с типом возвращаемого значения string.
[DllImport("cl.dll")]
private static extern string GetPalette();
А затем просто вызывает его из вашего кода C #.
string palette = GetPalette();
Внутри DllImport
атрибута может потребоваться установить правильное соглашение о вызове CallingConvention
и кодировку символов CharSet
Комментарии:
1. Я думаю, вы, возможно, захотите объяснить семантику onwership возвращаемых буферов (IIRC . NET освободит память с помощью free()?)
2. Спасибо Лукасу Кабрту. Ваш ответ на 100% правильный. Я использовал CharSet= кодировка. Ansi и изменил мои функции, возвращающие тип как string. И теперь я получаю правильные результаты.
Ответ №2:
Вы сказали C #, что соглашение о вызове является, __stdcall
но нет никаких доказательств __stdcall
маркировки самой функции. Кроме того, char*
может быть UTF-8.
Комментарии:
1. На самом деле, я новичок в .net Interoperability / Marshalling . Я использовал этот код соглашения stdcall из других источников. Возможно, я ошибаюсь. Итак, что я могу сделать сейчас, чтобы получить string из этой DLL-функции C ? Спасибо
2. Изменение вашего кода C # в соответствии с соглашением о вызовах кода C было бы началом.