Возможно ли для нативного класса использовать событие .NET? - PullRequest
4 голосов
/ 08 января 2009

Есть идеи, как инициализировать делегат .NET, указывающий на метод из экземпляра смешанного класса?

У меня есть «смешанный» класс C ++, подобный этому:

class CppMixClass
{
public:
    CppMixClass(void){
        dotNETclass->StateChanged += gcnew DotNetClass::ServiceStateEventHandler(&UpdateHealthState);
    }
   ~CppMixClass(void);
   void UpdateState(System::Object^ sender, DotNetClass::StateEventArgs^ e){
       //doSmth
   }
}

DotNetClass реализован на C #, и объявление метода в порядке с делегатом. Эта строка генерирует ошибку:

dotNETclass->StateChanged += gcnew DotNetClass::ServiceStateEventHandler(&UpdateHealthState);
error C2276: '&' : illegal operation on bound member function expression

У кого-нибудь есть подсказка о проблеме? Может быть, класс CppMixClass не является чистым классом .NET (ref)?

Это работает, когда UpdateHealthState является статическим методом, но мне нужен указатель на метод экземпляра.

Я пытался что-то вроде:

dotNETclass->StateChanged += gcnew DotNetClass::ServiceStateEventHandler(this, &UpdateHealthState);

Но это, очевидно, не работает, потому что это не указатель (дескриптор) на класс .NET (ref), (System :: Object).

ServiceStateEventHandler определен в C # как:

public delegate void ServiceStateEventHandler(object sender, ServiceStateEventArgs e);

Спасибо за чтение:)

Ответы [ 2 ]

5 голосов
/ 09 января 2009

Я только что нашел ответ на это (конечно, Нишант Сивакумар, у человека, похоже, есть ответы на все мои проблемы, связанные с взаимодействием C ++ / CLI):

http://www.codeproject.com/KB/mcpp/CppCliSupportLib.aspx?display=Print

Ответ находится в заголовке «msclr / event.h», где определены макросы для делегатов в собственных классах.

Код Ниша следующий:

class Demo5
{
msclr::auto_gcroot<FileSystemWatcher^> m_fsw;
public:
// Step (1)
// Declare the delegate map where you map
// native method to specific event handlers

BEGIN_DELEGATE_MAP(Demo5)
    EVENT_DELEGATE_ENTRY(OnRenamed, Object^, RenamedEventArgs^)
END_DELEGATE_MAP()

Demo5()
{
    m_fsw = gcnew  FileSystemWatcher("d:\\tmp");
    // Step (2)
    // Setup event handlers using MAKE_DELEGATE
    m_fsw->Renamed += MAKE_DELEGATE(RenamedEventHandler, OnRenamed);
    m_fsw->EnableRaisingEvents = true;
}
// Step (3)
// Implement the event handler method

void OnRenamed(Object^, RenamedEventArgs^ e)
{
    Console::WriteLine("{0} -> {1}",e->OldName, e->Name);
}
};
3 голосов
/ 08 января 2009

Только типы .NET могут использовать события. Я предлагаю создать новый управляемый класс, который обрабатывает событие, и создать этот класс в CppMixClass и передать ему указатель на CppMixClass во время создания. Ваш управляемый класс обработки событий может затем вызывать функцию в CppMixClass, когда он обрабатывает событие.

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