Как сделать авто обновление программы C# WPF?
Если нужна поддержка только Десятки и выше - можно перейти на MSIX, и обновлять приложение с помощью App Installer. Мы и сами так обновлялись, пока по ряду причин не решили заменить логику проверки и скачивания (НО не установки) обновлений на свою. При этом, мы всё равно остались на MSIX, и это позволяет нам устанавливать новую версию пакета одним вызовом UpdatePackageAsync. Если нужно, могу рассказать подробнее, что мы делаем своими силами, а где Винда сама справляется, и как вообще это работает.

Короче говоря, MSIX это хорошая база для распространения и обновления десктопных приложений, но все его игнорируют, т.к. он косвенно связан с UWP и Стором, хотя MS уже не первый год говорит, что эта технология работает и для большинства классических десктопных приложений, не имеющих к UWP никакого отношения. Но т.к. все уже испугались ужасного Стора, и бегают от него и UWP как чёрт от ладана, то бегают заодно и от MSIX, хотя поддержка Семёрки уже никому не впилась (Восьмёрку не считаем, это была бета-версия Десятки и уже перестала существовать).

Нужно ли создавать отдельный файл по типу updater.exe, который будет обновлять программу или можно внутри программы это все сделать?
Отдельный файл создают потому, что EXE-шник не может удалить сам себя, т.к. запущенный экзешник нельзя удалить или изменить без дополнительных хаков. Поэтому обычно всю работу по обновлению файлов делает отдельный процесс. Сам updater.exe потом можно обновить из основного процесса (при необходимости). В MSIX кстати этой проблемы нет, т.к. новая версия пакета всегда ставится рядом со старой, а старая удаляется позже, когда приложение завершит работу.
Уже есть готовые инструменты:
1. Autoupdaternet: https://github.com/ravibpatel/AutoUpdater.NET
2. Squirrel: https://github.com/Squirrel/Squirrel.Windows

Сам пользовался первым вариантом - работает вполне хорошо. Подводных нет