Вот мой звонок в C
cli::array<mercurial::fileItem>^ tmp = mercFlowCLR::merc::getFolderList(gcnew System::String(remotePath));
Вот моя структура C #:
public struct fileItem
{
public string fileName;
public bool isFolder;
}
Мой getFolderList возвращает тип в C #: List<mercurial::fileItem>
C ++ DLL оборачивает C # DLL. У меня есть C, вызывающий подпрограммы C #, и оба проекта C # и C ++ являются DLLS.
Как мне работать с fileName и isFolder в коде C?
Обновление:
Я изменил тип, как предложил Бен Фойгт:
System::Collections::Generic::List<mercurial::fileItem>^ tmp = mercFlowCLR::merc::getFolderList(gcnew System::String(remotePath));
Это позволило мне использовать tmp[0]->
и посмотреть мои поля структуры isFolder и fileName.
Когда я попытался скомпилировать, я получил набор из трех или четырех почти одинаковых ошибок для строки выше:
Error 7 error C2526: 'System::Collections::Generic::IList<T>::default::get' : C linkage function cannot return C++ class 'mercFlowCLR::mercurial::fileItem' y:\merc-flow\mercFlowCLRWrapper\mercFlowCLRWrapper.cpp 102 mercFlowCLRWrapper
Итак, я создал другую функцию, которая не использует extern "C" __declspec(dllexport)
, протестировал тот же код и скомпилировал. Я собираюсь попробовать прокси-запрос через функцию C ++ и посмотреть, работает ли он. Я использовал extern "C" с функцией, включающей вызов getFolderList.
Обновление 2: вышесказанное сработало. Спасибо за помощь Кейт и Бен.