Вопрос по pinvoke, c#, stringbuilder, out, parameters – C # P вызывать объявление строк

8

В 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);

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

Спасибо

Это правильно, если это работает. Там'нет очевидной причины, по которой это не должнот работа. Hans Passant

Ваш Ответ

2   ответа
3

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

Я думаю, что было бы хорошо добавить свойство CharSet, так как вы имеете дело со строками здесь.

Как это:

[DllImport(DllName, CharSet=CharSet.Auto)]
7

Я верю этому'правильно.

[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);
}

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