Ich würde das genauso machen wie bei einer
DLL: Mit einem Interface.
Sprich ich gebe der
DLL oder
BPL über eine Funktion das Interface und auf der anderen Seite werden dann alle registrierten Interfaces durchlaufen und eine darin enthaltene Ereignismethode aufgerufen.