Невозможно использовать управляемое событие / объекты в ошибке неуправляемого кода c3265, c2811 - PullRequest
4 голосов
/ 26 октября 2010

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

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

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

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

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 Ответ

18 голосов
/ 27 октября 2010

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

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

#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
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...