After we have solved the last one successfully, here comes the next design challenge. :-)
Dynamic proxies are very slow on the .NET platform, because they are realized with dynamic code generation that is compiled on run time. This causes a lot of overhead (e.g. the compiler and all necessary components have to be setup even for the execution of a single test).
My first simple approach is to replace the Announcer with just a List. This seems to work from the functionality perspective. It is a lot faster on the .NET platform. Additionally, the code does not change very much. Adding and removing listeners is very similar. The major difference is with announcing events / calling listeners. But this code is always well encapsulated in dedicated methods such as DocumentParser.announceBeforeParsing(), AssertEqualsCommand.announceSuccess(), ThrowableCaughtPublisher.throwableCaught(), etc.
You can have a look on the proposed changes here:
https://github.com/ShaKaRee/concordion/commit/33d4699ff1e44943ad9cba8d0eff0503cb2aa22c#diff-045b4469b168ea6fe78f51c2755d6d61If you prefer another solution, please feel free to prepare a pull request. :D