CreateInstance: Unbekannte Objekte verwenden
Bekannt sind der NameSpace, der Name der enthaltenden Assembly und der
Name der Klasse(n). Die jeweiligen Klasse realisieren ganz verschiedene
Dinge (Objekte), doch muß eine einheitliche Schnittstelle eingehalten
werden. Die Anwendung benötigt nur die drei Namen als String für alle
Zugriffe.
a) Für alle Objekte verbindliche Schnittstelle:
Public Interface IInterfaceAllg
Property Key() As String
Property Parameter() As String
...
Function Init() As Boolean
Function Command(ByVal parameter As String) As String
...
b) In Assembly myAss1(.dll) beliebige Objekttypen (Beispiel):
Public Class myObj1 : Implements IInterfaceAllg
Dim log As Log
Private mKey As String
Public Property Key() As String Implements IInterfaceAllg.Key
Get
Return mKey
End Get
Set(ByVal value As String)
mKey = value
End Set
End Property
Private mParameter As String
Public Property Parameter() As String Implements IInterfaceAllg.Caption
...
Public Function Init() As Boolean Implements IInterfaceAllg.Init
MsgBox("Nichts ausgeführt in myObj1.Init. Key: " _
& Key & " Parameter: " & parameter)
Return False
End Function
Public Function Command(ByVal parameter As String) _
As String Implements IInterfaceAllg.Command
MsgBox("Nichts ausgeführt in myObj1.Command. Parameter: " & parameter)
Return ""
End Function
...
c) Allgemeines einhüllendes Objekt:
Public Class myHüllObjekt
Private mObj As IInterfaceAllg
Public Property myObj() As IInterfaceAllg 'BasicDevice
Get
Return mObjekt
End Get
Set(ByVal value As IInterfaceAllg)
mObjekt = value
End Set
End Property
...
d) Erzeugen eines Hüllobjektes - realisiert Zugriff auf eine Klasse der Assembly(s):
Gegeben: Dim drvNameSpace As String = "myNameSpace"
Dim drvAssembly As String = "myAss1"
Dim drvClass As String = "myObj1"
Diese Werte können aus einer Datenbank, Registry, XML-Datei usw. kommen und auch später erweitert werden.
...
'ermittle die benötigten Assemblys
Dim myAssemblys As New Dictionary(Of String, Assembly)
For Each a As Assembly In My.Application.Info.LoadedAssemblies
Select Case Left(a.FullName, 6)
Case "myAss1"
myAssemblys.Add("myAss1", a)
Case "myAss2"
myAssemblys.Add("myAss2", a)
End Select
Next
Dim myAss As Assembly
myAss = myAssemblys(drvAssembly)
Dim o as myHüllObjekt
Dim oh As Runtime.Remoting.ObjectHandle = _
Activator.CreateInstance(myAss.FullName, _
drvNameSpace & "." & drvClass)
Dim dd As IInterfaceAllg = TryCast(oh.Unwrap(), IInterfaceAllg
( If dd Is Nothing Then...)
o.myObj = dd
e) Arbeiten mit dem Objekt:
o.myObj.Key = "Teil1"
Dim retVal as Boolean
retVal = o.myObj.Init()
...

