C# PInvoke представляет объявление в виде строки

В C# PInvoke, как я передаю строковый буфер так, чтобы DLL C заполнил его и возвраты? Каково будет объявление 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);

Я хотел бы знать, что это корректно или нет?

Спасибо

9
задан akif 3 January 2010 в 10:02
поделиться

2 ответа

Я считаю, что это правильно.

[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);
}
9
ответ дан 4 December 2019 в 15:20
поделиться

Я не думаю, что использование атрибута MarshalAs здесь необходимо. StringBuilder - правильный выбор для char* out.

Думаю, было бы неплохо добавить свойство CharSet, поскольку здесь вы имеете дело со строками.

Вот так:

[DllImport(DllName, CharSet=CharSet.Auto)]
4
ответ дан 4 December 2019 в 15:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: