Не удается использовать управляемые события / объекты в неуправляемом коде ошибка 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 ответ:
Ваш собственный класс должен хранить дескриптор управляемого объекта вместо ссылки на него. Это можно сделать с помощью шаблона 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 } };