Вам нужно проделать некоторую работу, чтобы отразить вызов метода Event (), чтобы он мог быть перехвачен управляемым классом. Давайте реализуем конкретный класс бла, который делает так:
#pragma managed(push, off)
struct EvenAtrgs {};
class blah {
public:
virtual void Event (EvenAtrgs e) = 0;
};
typedef void (* CallBack)(EvenAtrgs);
class blahImpl : blah {
CallBack callback;
public:
blahImpl(CallBack fp) {
this->callback = fp;
}
virtual void Event(EvenAtrgs e) {
callback(e);
}
};
#pragma managed(pop)
Теперь вы можете создать blahImpl и передать ему указатель на функцию, который вызывается при вызове метода Event (). Вы можете использовать Marshal :: GetFunctionPointerForDelegate () для получения такого указателя на функцию, он создает заглушку для делегата, которая выполняет переход от неуправляемого кода к управляемому коду, а также может хранить экземпляр. В сочетании с кодом шаблона для упаковки неуправляемого класса:
public ref class blahWrapper {
blahImpl* instance;
delegate void managedCallback(EvenAtrgs e);
managedCallback^ callback;
void fireEvent(EvenAtrgs e) {
// Todo: convert e to a managed EventArgs derived class
//...
Event(this, EventArgs::Empty);
}
public:
event EventHandler<EventArgs^>^ Event;
blahWrapper() {
callback = gcnew managedCallback(this, &blahWrapper::fireEvent);
instance = new blahImpl((CallBack)(void*)System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(callback));
}
~blahWrapper() { delete instance; }
!blahWrapper() { delete instance; }
};
Код C # теперь может написать обработчик события для события Event. Я оставил орфографическую ошибку в такте, вам нужно проделать определенную работу, чтобы преобразовать EvenAtrgs в управляемый класс, производный от EventArgs. Измените управляемое событие соответствующим образом.