C# PInvoke объявление строк
-
22-09-2019 - |
Вопрос
Как в C# PInvoke передать строковый буфер, чтобы C DLL заполнила его и вернулась?Какова будет декларация PInvoke?
Объявление функции C:
int GetData(char* data, int buflength);
В C# я объявил это как
[DllImport(DllName)]
static extern Int32 GetData([MarshalAs(UnmanagedType.LPStr)]StringBuilder receiveddata, Int32 buflen);
Это правильно?Я передаю переменную StringBuilder следующим образом
int bufferLength = 32;
StringBuilder data = new StringBuilder(bufferLength);
int result = GetData(data, bufferLength);
Хотелось бы узнать, правильно это или нет?
Спасибо
Решение
Я считаю, что это правильно.
[DllImport(DllName)]
static extern int GetData(StringBuilder data, int length);
который называется так:
StringBuilder data = new StringBuilder(32);
GetData(data, data.Capacity);
Однажды мне захотелось иметь больше контроля над байтами, возвращаемыми моей функцией, и я сделал это следующим образом:
[DllImport(DllName)]
private unsafe static bool GetData(byte* data, int length);
используется так:
byte[] bytes = new byte[length];
fixed(byte* ptr = bytes)
{
bool success = Library.GetData(ptr, length);
if (!success)
Library.GetError();
return Encoding.UTF8.GetString(bytes);
}
Другие советы
Я не думаю, что использование атрибута MarshalAs здесь необходимо.StringBuilder — правильный выбор для вывода символов.
Думаю, было бы неплохо добавить свойство CharSet, поскольку здесь вы имеете дело со строками.
Так:
[DllImport(DllName, CharSet=CharSet.Auto)]
Не связан с StackOverflow