So, if you develop "external applications" by yourself, I think, this is settled: no external applications, ever. Not a chance.
You need to develop external units as class-library assemblies which should implement some plug-in interface(s). Your host application should load all (candidate) assemblies, check up if they really implement the interface(s) and use it. If the plug-in suggests running of some processing scenario which take any noticeable time, it should be executed in a separate thread. This is all very easy if you don't have to unload the plug-ins during runtime. If you need to load then, unload and load again, repetitively, it would more then double the difficulty of development, so better avoid this requirement.
You can find all what's involved in my past answers:
Gathering types from assemblies by it's string representation[
^],
C# Reflection InvokeMember on existing instance[
^],
Dynamically Load User Controls[
^],
code generating using CodeDom[
^],
AppDomain refuses to load an assembly[
^],
AppDomain refuses to load an assembly[
^].
—SA