Давным-давно, работая над проектом .NET Compact Framework 1.0, я написал приложение для автоматического обновления. Мы использовали функцию развертывания CAB в SqlCE для загрузки файлов на устройство (теперь вы использовали бы Sync Framework), и у нас был отдельный exe-файл, который выполнял распаковку CAB и обновление файлов.
Обновление будет выглядеть следующим образом: пользователю будет предложено обновить его, нажать кнопку и выйти из приложения пользовательского интерфейса. Обновление exe-файла вступит во владение, получит файл cab с сервера, создаст резервную копию текущих dll и распакует файл cab с помощью wceload. Пользовательский интерфейс будет перезапущен, и в случае сбоя обновление будет отменено. Это все еще интересный сценарий для компактных устройств, но сейчас есть лучшие инструменты, чем просто sqlce.
Я бы, конечно, посмотрел на блок приложения обновлений и каркас синхронизации, чтобы реализовать это, если clickonce не вариант. Но я предполагаю, что вам все еще понадобится отдельный исполняемый файл, потому что dll, который вы хотите перезаписать, вероятно, заблокирован файлом во время использования exe, как уже говорилось в одном из предыдущих ответов.