Ich würde eine
Mutex als Semaphore nutzen.
CreaeteProcess oder SHellexecuteEX liefert dir ja auch in .net das Process
handle.
So lange das
handle valide ist läuft das Programm das du gestartet hast noch.
Und wenn du es gezielt beenden willst kannst du im aufrufenden Programm auch noch das
Handle nutzen um es zu töten.
Um mittzuteilen ,dass es noch lädt, könnte das delphi programm eine
Mutex erzeugen und diese abräumen wenn es mit dem Laden fertig ist (Beim ersten Form aktive oder so).
Das C# programm kann prüfen ob in windows diese
Mutex existiert.
Es ist quasi ein abgewandelter Mechanismus den man noramlerweise verwendet um zu verhindern das ein Prgramm zweimal gestartet wird.