События и делегаты
От: chaika_sv Россия wmryb.ru
Дата: 29.10.10 07:04
Оценка:
Всем привет.

Помогите, пожалуйста, разобраться с событиями и делегатами.
С одной стороны, у меня есть dll, написанная на C++/CLI. DLL должна инициировать события.
С другой стороны — C#-приложение, которое должно обрабатывать события от dll.

Привожу часть кода DLL:

    public delegate void MyEventHandler();  //  делегат

    public ref class clDriverMgr: System::Object
    {
        public:
            event    MyEventHandler^ MyEvent;  //  событие
    ...


Теперь привожу код из C#-приложения:

    public delegate void MyEventHandler();  //  всё тот же делегат

    public event MyEventHandler MyEvent;  //  событие

    private void MyHandlerThrower()  //  обработчик события
    {
        ...
    }

    //  далее в коде есть строка, которая ищет событие в классе source (clDriverMgr) и добавляет к нему обработчик
    source.GetEvent("MyEvent")
        .AddEventHandler(instance,
            new MyEventHandler(MyHandlerThrower));


Так вот на последней строке появляется Exception:

Невозможно преобразовать объект типа "VideoLink.Links.MyEventHandler" к типу "nsDriverMgr.MyEventHandler"


Поясню, что "VideoLink.Links.MyEventHandler" — это в C#, а "nsDriverMgr.MyEventHandler" — это для dll.

В принципе, понимаю, что что-то не так с делегатами, но что именно? Заранее благодарю за помощь.
Re: События и делегаты
От: _FRED_ Черногория
Дата: 29.10.10 07:07
Оценка: 2 (1)
Здравствуйте, chaika_sv, Вы писали:

_>Помогите, пожалуйста, разобраться с событиями и делегатами.


Из того, что написано в статье
Автор(ы): Алексей Дубовцев
Дата: 26.03.2005
Глава из книги Алексея Дубовцева “Microsoft .NET в подлиннике”, посвященная описанию работы с делегатами в .NET. Подробно разбираются многие аспекты работы с делегатами и на наглядных примерах раскрываются многие особенности использовании этой возможности.

, всё понятно?
Help will always be given at Hogwarts to those who ask for it.
Re[2]: События и делегаты
От: chaika_sv Россия wmryb.ru
Дата: 29.10.10 07:15
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Из того, что написано в статье
Автор(ы): Алексей Дубовцев
Дата: 26.03.2005
Глава из книги Алексея Дубовцева “Microsoft .NET в подлиннике”, посвященная описанию работы с делегатами в .NET. Подробно разбираются многие аспекты работы с делегатами и на наглядных примерах раскрываются многие особенности использовании этой возможности.

, всё понятно?


Судя по всему, статья хорошая, но я её почему-то раньше не встречал
Всё делал по книге Hogenson — C++/CLI The Visual C++ Language for dot.NET.

Спасибо большое за ссылку. Сейчас почитаю.
Re: События и делегаты
От: vmpire Россия  
Дата: 29.10.10 07:49
Оценка: 2 (1)
Здравствуйте, chaika_sv, Вы писали:

_>Так вот на последней строке появляется Exception:


_>

_>Невозможно преобразовать объект типа "VideoLink.Links.MyEventHandler" к типу "nsDriverMgr.MyEventHandler"


_>Поясню, что "VideoLink.Links.MyEventHandler" — это в C#, а "nsDriverMgr.MyEventHandler" — это для dll.

_>В принципе, понимаю, что что-то не так с делегатами, но что именно? Заранее благодарю за помощь.
Вы пытаетесь создать неправильный тип делегата.
Не нужно объявлять новый делегат в C# сборке, это будет другой тип, даже если имя совпадает.
Используйте MyEventHandler, объявленный с C++ (nsDriverMgr.MyEventHandler)


    public event MyEventHandler MyEvent;  //  событие

    private void MyHandlerThrower()  //  обработчик события
    {
        ...
    }

    //  далее в коде есть строка, которая ищет событие в классе source (clDriverMgr) и добавляет к нему обработчик
    source.GetEvent("MyEvent")
        .AddEventHandler(instance,
            new nsDriverMgr.MyEventHandler(MyHandlerThrower));
Re[2]: События и делегаты
От: chaika_sv Россия wmryb.ru
Дата: 29.10.10 13:06
Оценка:
V>Вы пытаетесь создать неправильный тип делегата.
V>Не нужно объявлять новый делегат в C# сборке, это будет другой тип, даже если имя совпадает.
V>Используйте MyEventHandler, объявленный с C++ (nsDriverMgr.MyEventHandler)

Да, спасибо. Теперь понимаю.
Но возникает ещё вопрос. Как "вытащить" этот делегат из сборки C++?
Я делаю так:

    var asm = Assembly.LoadFile(assembly);  //  Сборка
    var del = asm.GetType("nsDriverMgr.MyEventHandler");  //  Делегат


Тут всё проходит нормально. Делегат обнаруживается как класс, т.е. всё как и должно быть.
Дальше пытаюсь выполнить:

    source.GetEvent("MyEvent")                //  имя события
        .AddEventHandler(instance,        //  объект в C# (с ним всё в порядке)
            new del(MyHandlerThrower));   //  создаю экземпляр только что полученного делегата del и добавляю в него обработчик события MyHandlerThrower


На это компилятор почему-то ругается (почему?):

error CS0246: The type or namespace name 'del' could not be found (are you missing a using directive or an assembly reference?)


Тогда пробую создать экземпляр делегата вручную с помощью, как я понимаю, "скрытого" конструктора:

    Type[] types = new Type[2];
    types[0] = typeof(System.Object);
    types[1] = typeof(IntPtr);
    ConstructorInfo constructorInfoObj = del.GetConstructor(types);


Конструктор действительно такой существует и constructorInfoObj нормально инициализируется.
А вот дальше воспользоваться этим конструктором я не знаю как. Точнее знаю, что надо писать что-то вроде:

    instance = constructorInfoObj1.Invoke(new object[2]{?, ?});


Догадываюсь, что первый параметр — это C#-объект (object instance), а второй — обработчик события (MyHandlerThrower). Но не получается.

Думаю, моя проблема ясна. Надеюсь на помощь.
Re[2]: События и делегаты
От: chaika_sv Россия wmryb.ru
Дата: 29.10.10 13:11
Оценка:
Прошу прощения, немного ошибся в предыдущем сообщении. Там последняя строка кода должна выглядеть так:

    object del1;
    del1 = constructorInfoObj1.Invoke(new object[2]{?, ?});
Re[3]: События и делегаты
От: _FRED_ Черногория
Дата: 29.10.10 13:17
Оценка: 3 (1)
Здравствуйте, chaika_sv, Вы писали:

_>Тут всё проходит нормально. Делегат обнаруживается как класс, т.е. всё как и должно быть.

_>Дальше пытаюсь выполнить:
_>На это компилятор почему-то ругается (почему?):

Ищущий да обрящет.
Help will always be given at Hogwarts to those who ask for it.
Re[4]: События и делегаты
От: chaika_sv Россия wmryb.ru
Дата: 29.10.10 13:27
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Ищущий да обрящет.


Да уж.. Похоже то, что надо.
Спасибо большое!
Re: События и делегаты
От: TK Лес кывт.рф
Дата: 30.10.10 18:35
Оценка:
Здравствуйте, chaika_sv, Вы писали:

_>Помогите, пожалуйста, разобраться с событиями и делегатами.

_>С одной стороны, у меня есть dll, написанная на C++/CLI. DLL должна инициировать события.
_>С другой стороны — C#-приложение, которое должно обрабатывать события от dll.

Зачем вам для этого события, не проще использовать для этого шаблон Observer? Если уж dll и приложение находится под вашим контролем...
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.