Не удается использовать управляемые события / объекты в неуправляемом коде ошибка c3265, c2811


Собственная библиотека C++, которую я использую в проекте C++ / CLI, вызывает события, дающие мне результаты,

  • Если я попытаюсь обработать событие, расширив неуправляемое событие, он скажет, что класс ref может только расширить класс ref.
  • Затем я попытался создать собственное событие, но внутри него есть объект manged для сбора результатов, но я получаю ошибку не могу объявить управляемый объект в неуправляемом классе.

Есть ли в любом случае, чтобы сделать это одним из способов, которые я пытаюсь, или я должен объявлять неуправляемые объекты результата, заполнять их неуправляемым событием и затем Маршалл его ?

Редактировать:

class MyNativeListener: public NativeEventListener
{ 
private:
    ManagedResultsObject ^_results;
public:

void onEndProcessing(ProcessingEvent *event) 
{
    _results.Value = event->value;
      //Many more properties to capture

}

};

Это то, что я пытаюсь, я расширил собственный прослушиватель событий, чтобы захватить событие, но не уверен, как захватить результаты в управляемый объект.

Edit2 Нашел это при поиске в той же строке, что и @ mcdave auto_gcroot

1 4

1 ответ:

Ваш собственный класс должен хранить дескриптор управляемого объекта вместо ссылки на него. Это можно сделать с помощью шаблона gcroot . Если вы покопаетесь в шаблоне gcroot, то обнаружите, что он использует структуру GCHandle, которая при соответствующем статическом приведении может храниться в виде указателя void* и таким образом обеспечивает средство хранения управляемых ссылок в машинном коде.

Попробуйте расширить код следующим образом:

#include <vcclr.h>

class MyNativeListener: public NativeEventListener
{ 
private:
    gcroot<ManagedResultsObject^> _results;
public:
    void onEndProcessing(ProcessingEvent *event) 
    {
        _results->Value = event->value;
        //Many more properties to capture
    }
};