NeoGriever: vb.net - Unbekanntes Event. IF Exists AddHandler. Hilfe.

Hi

Ich habe ein kleines Problemchen.

Ich möchte ein "unbekanntes" Event hinzufügen. Dabei ist dies eine "Versions"-Schwäche. Denn vorherige "Plugins", welche dynamisch aus mehreren DLL's geladen werden, haben dieses Event nicht, neuere jedoch schon. Daher möchte ich eine Möglichkeit haben, zu prüfen, ob das Event vorhanden ist. Und wenn es vorhanden ist, dass es automatisch mit AddHandler ... angeknüpft wird.

Derzeit liegt aber mein Problem darin, dass mein Compiler es nicht erlaubt, undefinierte Events hinzuzufügen.

Das hier funktioniert einwandfrei:

--- CODE ---
If Not Me.MeControl.EntryFound Is Nothing Then
--- CODE ---

Aber das hier geht dann nicht, da sagt er, das Event existiert nicht. (beim Compilieren)

--- CODE ---
AddHandler Me.MeControl.EntryFound, AddressOf HandlerEntryFound
--- CODE ---

Me.MeControl wird aus einer Assembly heraus geladen aus einer dynamischen DLL

--- CODE ---
Me.Ass = Assembly.LoadFile(DLLFile)
Dim objectValue As Object = Ass.CreateInstance(("PluginLIB.Plugin_PAGE1"))
Me.MeControl = objectValue
--- CODE ---

Ich hoffe, mir kann da jemand helfen. *seufz*

  1. Hallo, vergiss Events und baue dir einen app internen MessageBus ... da kannst du beliebig an- und abhaengen was aus Plugins kommt oder dahin gehen soll. Ciao, Frank

    1. Hallo, vergiss Events und baue dir einen app internen MessageBus ... da kannst du beliebig an- und abhaengen was aus Plugins kommt oder dahin gehen soll. Ciao, Frank

      Wenn du mir erklären könntest, wie ich das anstelle? Das hört sich tausendfach komplizierter an als das, was ich möchte. Ich möchte EIN event aus einer externen, dynamisch via assembly geladenen klasse verknüpfen, WENN vorhanden. (wenn nich, kann da ruhig nen otr-exception ausgelöst werden, welches ich mit Try Catch abfangen kann. (Mir gehts nicht so um die millisekunden-performance)

      1. Hi, ein MessageBus (ein einfacher, den man wunderbar innerhalb einer Anwendung verwenden kann) ist ein Service (meistens als Singleton) welcher einen Methodenaufruf, z.b.

        MessageBus mb = MessageBus.GetDefault();
        mb.Publish<string>(null, "This is your message");
        // Signatur: Publish<string>(object recipient, string message);

        an alle Interessenten/Subscriber ueber Delegates (wie eigentlich auch bei Events) weiterreicht.

        In deinem Plugin wuerdest also nach dem Laden quasi folgendes ausfuehren:

        MessageBus mb = MessageBus.GetDefault();
        mb.Subscribe<YourMessageType>(this, (msg) => this.ExecuteThisMethodWhenAMessageArrives(msg));

        und spaeter wieder
        mb.Unsubscribe(this);

        Die Signatur der Subscribe Methode
        Subscribe<TMessageType>(object recipient, Action<TMessageType> actionOnMessageArrival);

        In der Methode verwaltest du einfach ein Dictionary aus MessageTypes (Dictionary Key) und Listen von WeakAction[*] Referenzen.

        Alles was du dann in der Publish Methode machst ist

        1. stelle den Type von Message fest
        2. schau ins Dictionary ob es fuer diesen MessageTyp WeakActions[*] gibt
        3. teste ob die WeakAction evt. schon disposed/null ist ( != null, IsAlive)
        4. teste ob der (intended) Recipient dem Target aus der WeakAction[*] entspricht
        5. fuehre die WeakAction aus: (WeakAction as IExecWithObject).ExecWithObject(yourmessage);

        und fertig.
        Universell, flexibel einsetzbar im Hauptteil des Programms und genauso in Plugins. Geringer Overhead, auf- und abwaertskompatibel ...

        Aufwand: ca. 2,5 Std, ca. 250 LoC

        Ciao, Frank

        [*]WeakAction und IExecWithObject sind einfach ein Wrapper um WeakReference und Action<T>.