Как получить структурированный список значений из неуправляемого кода C ++ в C #? - PullRequest
0 голосов
/ 28 января 2019

Я пишу парсер файлов "ICS / VCS" в win32 c ++.

После десериализации из файла я храню данные о событиях в списке структуры событий.

Теперь я хочу получить доступ к этому структурированному списку в c #.Для этого я экспортировал функцию и список в DLL.

Я не знаю, как получить доступ к этому списку в c #.

Вот моя структура событий:

struct Event {
Event(): Alarms(new list<Alarm>), RecurrenceNo(0), BaseEvent(this) {}
Event(const Event &Base) :
    UID(Base.UID),
    Organizer(Base.Organizer),
    Summary(Base.Summary),
    Description(Base.Description),
    Attendee(),
    Categories(Base.Categories),
    DtStamp(Base.DtStamp),
    DtStart(Base.DtStart),
    DtEnd(Base.DtEnd),
    RRule(Base.RRule),
    Alarms(Base.Alarms),
    AttendeeCounter(Base.AttendeeCounter),
    RecurrenceNo(Base.RecurrenceNo)

{
    BaseEvent = Base.BaseEvent == (Event *)&Base ? (Event *)&Base : Base.BaseEvent;
}
~Event() {
    if (BaseEvent == this)
        delete Alarms;
}
operator string() const;
bool HasAlarm(const Date &From, const Date &To);

string UID, Summary, Description, Categories, Attendee[100], Organizer;
int AttendeeCounter=0;
Date DtStamp, DtStart, DtEnd;
Recurrence RRule;
list<Alarm> *Alarms;
unsigned short RecurrenceNo;
Event *BaseEvent;
};

Вот ExportFunction.h

extern list <Event *> ListofAllEvents;
extern "C" __declspec(dllexport) list <Event *> ParseCalendar(std::string FilePath);

Вот функция, которую я экспортирую " ExportFunction.cpp "

list <Event *> ParseCalendar(std::string FilePath)
{
const char * InputPath = FilePath.c_str();

ICalendar Calendar(InputPath);
return ListofAllEvents;
}

Вот Program.cs

    [DllImport("D:\\Projects\\iCalander\\x64\\Debug\\iCalander.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern IntPtr ParseCalendar(string FilePath);

Показывает ошибку нарушения доступа.что ожидается, потому что я не получаю доступ правильно.

Я новичок в pInvoke и маршалинге.

1 Ответ

0 голосов
/ 08 февраля 2019

Отвечая на мой вопрос для дальнейшего использования, если кто-то захочет сделать то же самое.

Я следовал этому руководству, чтобы экспериментировать и узнавать о взаимодействии.

https://www.red -gate.com / simple-talk / dotnet / net-development / creation-ccli-wrapper /

https://www.red -gate.com / простой разговор / DotNet / .net-рамки / 5-tips-for-understanding-managed-unmanaged-interoperability-in-.net /? _ га = 2.110977479.318099589.1504532675-232460203.1501855788

1014 *Затем я реализовал класс-прототип структуры событий в c ++ / cli.
public ref class iCalendarEvent 
{
public:
    String ^mUID;
    String ^mOrgaizer;
    String ^mSummary;
    String ^mDescription;
    String ^mCategories;
    String ^mDtStart;
    String ^mDtEnd;
    String ^mDtStamp;
    cli::array<String ^>^ mAttendee = gcnew cli::array<String ^>(100);
    int mAttendeeLength;

};

Затем был создан общий список типа iCalendarEvent.Затем я отобразил каждый объект события, возвращенный из c ++, в класс obj из c ++ / cli и вставил его в общий список c ++ / CLI.

...