Hallo,
Ich habe mehrere Dlls vorliegen die ich dynamisch ins programm einbinde.
In der Dll befindet ist ein Event definiert welches sporadisch abgefeuert wird. dieses Event möchte ich nun in meinem Program abfragen.
Ein einfaches Bsp. wie folgt
Form1
Das Modul wo die Dll geladen wird schaut wie folgt aus
Und die dazugehörige Klasse
Ein simples Bsp. wie die Dll ausschaut ist wie folgt
In der Form( in der Dll) wird lediglich beim drücken des Beenden Buttons die Form geschlossen und IsRunning auf False gesetzt und somit das Event ausgelöst.
Meine Frage wäre jetzt wie kann ich das Event im Program abfragen?
LG ALex
Ich habe mehrere Dlls vorliegen die ich dynamisch ins programm einbinde.
In der Dll befindet ist ein Event definiert welches sporadisch abgefeuert wird. dieses Event möchte ich nun in meinem Program abfragen.
Ein einfaches Bsp. wie folgt
Form1
VB.NET-Quellcode
- Private Sub GetToolsFromDll(Directory As String)
- Dim ToolList As List(Of DllMember) = LoadDynamicDll(Directory, True) ' WIr laden die DLL's
- ToolsToolStripMenuItem.Visible = ToolList.Count > 0 ' Wir passen das Menu an
- DummyToolStripMenuItem.Visible = ToolList.Count = 0 ' Wir passen das Menu an
- For Each Item As DllMember In ToolList ' Wir durchlaufen die DLL's
- Dim NewItem As New ToolStripMenuItem(Item.Title) With {.Tag = Item, .Name = Item.Title} 'Wir erstellen ein MenuItem
- ToolsToolStripMenuItem.DropDownItems.Add(NewItem) 'WIr weisen es dem Menu zu
- AddHandler NewItem.Click, AddressOf Tool_Click 'WIr definieren einen Ereignishandler
- 'Dim e As Reflection.EventInfo = Item.myCls.GetType.GetEvent("FormChanged")
- NewItem = Nothing
- Next
- End Sub
- Private Sub Tool_Click(Sender As Object, e As EventArgs)
- Dim Member As DllMember = DirectCast(DirectCast(Sender, ToolStripMenuItem).Tag, DllMember)
- Dim myobj As Object = Member.MyMethode.Invoke(Member.myCls, Nothing)
- 'Dim svalue As Boolean = Member.myCls.GetType.GetMethod("IsRunning").Invoke(Member.myCls, Nothing) -> Aufruf Function In DLL
- End Sub
Das Modul wo die Dll geladen wird schaut wie folgt aus
VB.NET-Quellcode
- Private Function FoundDll(ByVal Directory As String, IncludeSubDirectorys As Boolean) As List(Of String)
- Dim FoundFiles As New List(Of String)
- Dim [Option] As IO.SearchOption = IIf(IncludeSubDirectorys, IO.SearchOption.AllDirectories, IO.SearchOption.TopDirectoryOnly)
- Dim oDir As New System.IO.DirectoryInfo(Directory)
- Dim oFile As System.IO.FileInfo() = oDir.GetFiles("*.dll", [Option])
- For Each Item As IO.FileInfo In oFile : FoundFiles.Add(Item.FullName) : Next
- Return FoundFiles
- End Function
- Public Function LoadDynamicDll(ByVal Directory As String, ByVal IncludeSubDirectorys As Boolean) As List(Of DllMember)
- Dim Member As New List(Of DllMember)
- Dim NewMember As DllMember
- Dim DllList As List(Of String) = FoundDll(Directory, IncludeSubDirectorys)
- If DllList.Count = 0 Then Return Member
- For Each Item As String In DllList
- NewMember = RunDll(Item)
- If Not IsNothing(NewMember) Then Member.Add(NewMember)
- Next
- Return Member
- 'Member(0).MyMethode.Invoke(Member(0).myCls, Nothing) -> So kann aus der Klasse das Tool gestartet werden...
- End Function
- Private Function RunDll(sFile As String) As DllMember
- Try
- Dim assembly As Reflection.Assembly
- Dim myMethode As Reflection.MethodInfo
- Dim myCls As Object
- assembly = Reflection.Assembly.LoadFile(sFile)
- If IsNothing(assembly) Then Return Nothing
- myCls = assembly.CreateInstance(assembly.ExportedTypes(0).FullName)
- If IsNothing(myCls) Then Return Nothing
- myMethode = myCls.GetType.GetMethod("Run")
- If IsNothing(myMethode) Then Return Nothing
- Return New DllMember(myCls, myMethode, assembly.ExportedTypes(1).Namespace.ToString)
- 'myMethode.Invoke(myCls, Nothing) -> So wird die Dll gestartet....
- Catch ex As Exception
- Return Nothing '-> Kann auftreten, wenn im Modul kein Manifest vorliegt, falsche dll zum bsp.
- End Try
- End Function
Und die dazugehörige Klasse
VB.NET-Quellcode
Ein simples Bsp. wie die Dll ausschaut ist wie folgt
In der Form( in der Dll) wird lediglich beim drücken des Beenden Buttons die Form geschlossen und IsRunning auf False gesetzt und somit das Event ausgelöst.
Meine Frage wäre jetzt wie kann ich das Event im Program abfragen?
LG ALex
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Alex74“ ()