Я портирую существующую библиотеку / DLL, написанную на C ++ / VisualStudio, на кодовые блоки / GCC.DLL в Windows была протестирована на C #, C, C ++, Python, Delphi, Java, VB.NET, LabVIEW и т. Д. И работает нормально и стабильно.Однако при портировании его на Linux у меня возникают проблемы при тестировании его из Mono / C #, в то время как он работает нормально с FreePascal и Python.
Корень проблемы - это функция, которая обнаруживает некоторые устройства и возвращает их.целое число с количеством обнаруженных устройств и списком путей (массив строк символов ASCII), в которых расположены устройства, через параметры:
int DetectDevices(char ** DevicePaths);
Они копируют результаты вбиблиотека:
i=0;
for (vector<string>::iterator it=lstDetected.begin(); it!=lstDetected.end(); ++it)
strcpy(DevicePaths[i++], (*it).c_str());
В C # я объявляю внешнюю функцию, используя следующий код:
[DllImport(LIBRARY_PATH)]
public static extern int DetectDevices([In, Out, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[] DevicePaths);
Я хотел бы отметить, что я на самом деле резервирую некоторое пространство памятив C # перед вызовом функции и получением возвращенного значения:
string[] DevicePaths = new string[50];
for (int i=0; i<DevicePaths.Length; i++)
DevicePaths[i] = new string('\0', 255);
Это нормально работает в Windows / VisualStudio, но не в Linux / Mono.
Замена LPStr на LPWStr и выполнениеотладка, показывает, что символы предположительно прибывают, но эквивалентный полученный код ASCII равен 0 для всех символов в LPStr и 63 в LPWStr.
Я тдумая, что это может быть связано с проблемой, связанной с кодировкой символов, но я могу ошибаться.
Кто-нибудь знает, что здесь может быть не так?Помощь будет высоко ценится!