Im Prinzip hast Du schon alles was Du benötigst.
Das, was Dein Zusatzprogramm macht (nachgucken ob eine neue Version da ist & ggf. kopieren) packst Du in den Dienst.
Beim Programmstart schickst Du eine Anfrage an den Dienst (via
Named Pipe) und fragst dort nach, ob es eine neue Version gibt. Wenn ja, wartest und lässt den Dienst erstmal neu kopieren. Wenn dann vom Dienst die message kommt "Ist alles kopiert", dann startest Du erst die .exe.
Wie gesagt: Du brauchst eigentlich nur die Nachrichten: "Ist was neues da?" - ja/nein und wenn ja warten auf "Ist fertig kopiert!". Und dazu eben die named pipes.