Обработка нативной структуры в C # в C ++ - PullRequest
1 голос
/ 25 июля 2010

Вот мой звонок в 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: вышесказанное сработало. Спасибо за помощь Кейт и Бен.

Ответы [ 2 ]

1 голос
/ 26 июля 2010

Так как это List в C #, попробуйте

System::Collections::Generic::List<mercurial::fileItem>^ tmp =  mercFlowCLR::merc::getFolderList(gcnew System::String(remotePath));

вместо cli::array, что совпадает с C # fileItem[].

0 голосов
/ 25 июля 2010

Вы определенно можете использовать управляемую DLL с неуправляемым приложением C ++.

Каждый тип C # (List, String, Bool) имеет тип отображения в CLR; все управляемые типы в VB.net, Managed C ++ и C # преобразуются в определенные типы в CLR. Microsoft предоставляет механизм COM для извлечения данных из управляемых структур данных.

Некоторые полезные ссылки:

http://msdn.microsoft.com/en-us/library/ms173185.aspx

http://msdn.microsoft.com/en-us/library/zsfww439.aspx

http://msdn.microsoft.com/en-us/library/c3fd4a20.aspx // хороший пример

http://msdn.microsoft.com/en-us/library/ms973872.aspx // обзор

http://www.codeproject.com/KB/mcpp/Implicit_PInvoke.aspx // Полный пример из CodeProject

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...