Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вызов события в основной программе 
:(
    Опции темы
Evropeec
Дата 5.12.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 20.2.2007

Репутация: нет
Всего: нет



Помогите,
как можно сделать вызов из dll события в основной программе.
т.е. есть интерфейс с событием

Код


Public Interface IPeripherie
...
    Event SetScanResult(ByVal Result() As Char)
...
End Interface



в классе я его прописываю и где-то вызываю


Код


Public Class SerialPort
    Implements IPeripherie
...
    Public Event SetScanResult(ByVal Result() As Char) Implements IPeripherie.SetScanResult
....
    Private Sub Events(ByVal sender As Object, ByVal e As IO.Ports.SerialDataReceivedEventArgs) 
...
        RaiseEvent SetScanResult(Result)
...
    End Sub
...
End Class



это всё находится в dll,
теперь, в вызывающей программе есть класс


Код


Public Class Peripherie

    Friend Shared LibraryInterface As Object = Nothing
    Friend Shared TypeInterface As Type = Nothing
    Friend Shared ev As System.Reflection.EventInfo

    Private AssemblyLibrary As System.Reflection.Assembly
    Public Delegate Sub DGetScanResult(ByVal Result() As Char)
 
    Sub New()
        Dim m_App_Path As Char() = App_Path()
        AssemblyLibrary = System.Reflection.Assembly.LoadFrom(m_App_Path & "\myLibrary.dll")

        LibraryInterface = AssemblyLibrary.CreateInstance("EnginiusLibrary.SerialPort")
        TypeInterface = AssemblyLibrary.GetType("EnginiusLibrary.IPeripherie")
        ev = TypeInterface.GetEvent("SetScanResult")


        Dim D As New DGetScanResult(AddressOf GetScanResult)
        ev.AddEventHandler(Me, D)

    End Sub

    Public Sub GetScanResult(ByVal Result() As Char)
        Base.SetBarcode = Result
    End Sub

End Class



мне надо что-бы по событию "RaiseEvent SetScanResult(Result)" вызывался метод "GetScanResult"

ошибка вылетает в "ev.AddEventHandler(Me, D)"

InvalidProgrammException
PM MAIL   Вверх
diadiavova
Дата 5.12.2008, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Вместо вот этог всего
Код

 ev = TypeInterface.GetEvent("SetScanResult")
        Dim D As New DGetScanResult(AddressOf GetScanResult)
        ev.AddEventHandler(Me, D)


Есть стандартные средства

Код

AddHandler ev.SetScanResult, AddressOf GetScanResult

Если я правилно всё понял.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Evropeec
Дата 8.12.2008, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 20.2.2007

Репутация: нет
Всего: нет



к сожалению ev имеет тип System.Reflection.EventInfo, а не IPeripherie. У System.Reflection.EventInfo нет ни свойства, ни метода SetScanResult.
PM MAIL   Вверх
PashaPash
Дата 8.12.2008, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



Evropeec, есть два варианта:
1. Кривой: выброси интерфейс, т.к. ты его не используешь. Работай только через reflection, и передавай в ev.AddEventHandler( ) LibraryInterface  вместо Me.
2. Вынеси IPeripherie и DGetScanResult в отдельную сборку. Нормально обзови событие (SetScanResult -> ScanCompleted), явно пропиши ему тип DGetScanResult (-> ScanCompletedEventHandler). И спокойно подписывайся через AddHandler CType(LibraryInterface, IPeripherie).SetScanResult, AddressOf GetScanResult.


--------------------
PM MAIL WWW   Вверх
diadiavova
Дата 8.12.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Пардон: не внимательно прочитал код
Код

AddHandler LibraryInterface.SetScanResult, AddressOf GetScanResult

Принцип всё равно тот же.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0592 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.