Я делал как-то примитивное обновление программулины так: обновляющий клиент собирает CRC32 со всех компонентов, шлёт на сервер, а тот возвращает сгенерированный архив с файлами, у которых контрольная сумма различается. Клиент распаковывает архив в рабочую папку и всё.