Blog Schröder

Sammlung von Codeschnipseln zu Programmierproblemen.
Daten aus fremden Quellen unterliegen deren Rechten.
Siehe auch: Disclaimer auf www.computer-schroeder.de

Freitag, 18. April 2008

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()
   ...