Передать ссылку на строку из C # в функцию C

#c# #c #mfc

#c# #c #mfc

Вопрос:

У меня есть библиотека C , и я написал в ней несколько функций.
эта функция должна возвращать целое число и строку. (2 вывода), и я собираюсь вызвать эту функцию из моей программы на C #.
вот мой код на C :

 extern "C"{

    __declspec(dllexport)   UINT Read(OUT char* Temp )
    {
    .....
    }  
}  
  

и это мой код на C # в ImportDll классе:

 [DllImport("Library.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint Read(char[] temp);  
  

и в моей форме у меня есть это:

 char[] str = new char[256];  
ImportDLL.Read(str);  
  

он возвращает значение Int правильно, но результат строки (массив str) полностью равен нулю ()!
что не так с моим кодом?
Спасибо.

Комментарии:

1. Зачем использовать char[], вы можете использовать string .

2. Если у вас есть код dll, вы можете отладить функцию «Чтения» и посмотреть, что происходит внутри функции.

Ответ №1:

Одно дополнение к ответу от Мэтью Уотсона: вам также потребуется присвоить параметру stringbuilder значение LPSTR (char *), например

 [DllImport("Library.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint Read([MarshalAs(UnmanagedType.LPStr)] StringBuilder temp);
  

Ответ №2:

Поскольку возвращаемое значение является OUT , я предполагаю, что оно создано методом C .

В этом случае вам может потребоваться передать ей StringBuilder:

 [DllImport("Library.dll", CallingConvention = CallingConvention.Cdecl, CharSet=CharSet.Unicode)]
public static extern uint Read(StringBuilder temp);  
  

Обратите внимание, что вы также должны указать кодировку, которая зависит от кодировки символов, используемой вашим кодом C — ANSI или Unicode.

Чтобы вызвать ее, создайте новый StringBuilder достаточного размера и передайте его Read() , а затем используйте StringBuilder .toString() для извлечения строки после Read() возврата.

Если функция C ожидает, что строковый буфер определенного размера, вам необходимо создать StringBuilder, чтобы он был как минимум такого размера, например:

 const int BUFFER_SIZE = 128;
var sb = new StringBuilder(BUFFER_SIZE);
Read(sb);
var result = sb.ToString();
  

Примечание: трудно сказать, действительно ли это правильное решение, не зная деталей функции C . Возможно, вам просто нужно передать строку.

Комментарии:

1. Большое вам спасибо, это было полезно, но правильный ответ таков: [MarshalAs(UnmanagedType . LPStr)] StringBuilder temp