Приложение clickonce не удаляется
Доброго дня. Недавно получил один вопрос от пользователя. Приведу дословно:
«Приветствую. Подскажите пожалуйста, как удалить программу (одну игру). В общем, захожу в панель управления, нахожу установленные программы, жму кнопку удалить — программа не удаляется (появляется какая-то ошибка и все)! Есть ли какой-то способ, как удалить любую программу с ПК? Пользуюсь ОС Windows 8. Заранее благодарю, Михаил…»
В этой статье хочу ответить подробно на этот вопрос (тем более, что задают его довольно часто). И так…
Большинство пользователей пользуются стандартной утилитой Windows для установки и удаления программ. Чтобы удалить ту или иную программу, нужно зайти в панель управления Windows и выбрать пункт « удаление программ » (см рис. 1).
Рис. 1. Программы и компоненты — Windows 10
Но сравнительно часто, при удалении программ таким способом возникают разного рода ошибки. Чаще всего такие проблемы возникают:
— с играми (видимо разработчики не сильно заботятся о том, что их игру когда-нибудь нужно будет удалить с компьютера);
— с различными тулбарами и дополнениями для браузеров (это вообще, отдельная тема…). Как правило, многие из этих дополнений можно сразу отнести к вирусным, и польза от них сомнительная (если не считать показ рекламы на пол экрана «пользой»).
Если удалить программу через «Установка и удаление программ» (извиняюсь за тавтологию) не получилось, рекомендую использовать следующие утилиты: Geek Uninstaller или Revo Uninstaller .
Geek Uninstaller
Рис. 2. Geek Uninstaller 1.3.2.41 — главное окно
Отличная небольшая утилита для удаления любых программ! Работает во всех популярных ОС Windows: XP, 7, 8, 10.
Позволяет увидеть все установленные программы в Windows, произвести принудительное удаление (что будет актуально, для не удаляемых программ обычным способом), а кроме этого Geek Uninstaller сможет почистить все «хвосты», остающиеся после удаления софта (например, разного рода записи в реестре).
Кстати, так называемые «хвосты» обычно не удаляются стандартными средствами Windows, что не очень хорошо сказывается на работе Windows (особенно, если такого «мусора» скапливается слишком много).
Чем особо привлекает Geek Uninstaller:
— возможность удалить в ручную запись в реестре (а так же узнать ее, см. рис. 3);
— возможность узнать папку установки программы (таким образом так же удалить ее вручную);
— узнать официальный сайт любой установленной программы.
Рис. 3. Возможности программы Geek Uninstaller
Итог: программа в стиле минимализма, нет ничего лишнего. Вместе с тем, хороший инструмент в рамках своих задач, позволяет удалить весь софт, установленный в Windows. Многие не понимают различий между шлюхами на трасах и искушенными индивидуалками. На самом деле разница огромная. Для первых секс является средством заработка на жизнь, а вторые превращают интимный досуг в настоящее искусство. Поэтому индивидуалки Ростова-на-Дону часто проходят курсы повышения квалификации в сексе, осваивают необычные виды интимных услуг. При ставке 2000 руб. за час многие могут предложить приятный доп к классике либо минету. А при ставке 3000+ можно заказать целый пакет услуг для полноценного удовлетворения. Удобно и быстро!
Revo Uninstaller
Одна из лучших утилит для удаления нежелательных приложений из Windows. Программа имеет в своем арсенале хороший алгоритм сканирования системы не только установленных программ, но и тех, которые были давно уже удалены (остатки и «хвосты», ошибочные записи в реестре, которые могут сказываться на скорости работы Windows).
Рис. 4. Revo Uninstaller — главное окно
Кстати, многие рекомендуют ставить подобную утилиту одну из первых, после установки новой Windows. Благодаря режиму «охотнику» утилита способна отслуживать все изменения, которые происходят с системой при установке и обновлении любых программ! Благодаря этому в любой момент можно удалить сбойное приложение и вернуть свой компьютер в прежнее рабочее состояние.
Итог: на мой скромный взгляд, Revo Uninstaller предлагает тот же функционал, что и Geek Uninstaller (разве только, что пользоваться ей по удобнее — есть удобные сортировщики: новые программы, давно не используемые и пр.).
Большинство приложений потребляют или производят данные. ClickOnce предоставляет разнообразные методы чтения и записи данных как локально, так и удаленно.
Локальные данные
В ClickOnceможно загружать и хранить данные локально, используя любой из следующих методов.
Другие локальные файлы
Каталог данных ClickOnce
Каждое установленное на локальном компьютере приложение ClickOnce имеет каталог данных, который сохранен в папке пользователя Documents and Settings. Любой файл, включенный в приложение ClickOnce и помеченный как файл «данных», копируется в этот каталог при установке приложения. Файлы данных могут представлять собой данные любого типа. Чаще всего используются текстовые файлы, файлы XML и файлы базы данных, например MDB-файлы Microsoft Access.
Каталог данных предназначен для управляемых приложением данных, то есть данных, которые приложение явно сохраняет и обслуживает. Все статические, независимые файлы, которые не помечены как «данные» в манифесте приложения, помещаются в каталог приложения. В этом же каталоге находятся исполняемые файлы приложения (.exe) и сборки.
Если приложение ClickOnce удаляется, его каталог данных также удаляется. Никогда не используйте каталог данных для хранения управляемых конечным пользователем данных, например документов.
пометка файлов данных в распределении ClickOnce
Чтобы поместить существующий файл внутрь каталога данных, необходимо пометить существующий файл как файл данных в файле манифеста приложения вашего приложения ClickOnce . дополнительные сведения см. в разделе инструкции. включение файла данных в приложение ClickOnce.
Чтение из каталога данных и запись в него
Для чтения из каталога данных нужно, чтобы приложение ClickOnce запросило разрешение на чтение; аналогично для записи в каталог требуется разрешение на запись. Ваше приложение получит это разрешение автоматически, если оно настроено для работы с полным доверием. дополнительные сведения о повышении разрешений для приложения с помощью повышения разрешений или развертывания доверенных приложений см. в разделе безопасные ClickOnce приложения.
Если в организации не используется развертывание надежных приложений и отключено повышение уровня разрешений, подтверждение разрешений завершится ошибкой.
Получив эти разрешения, ваше приложение сможет осуществлять доступ в каталог данных, используя вызовы метода в классах типа System.IO. Можно получить путь к каталогу данных в приложении ClickOnce в Windows Forms, воспользовавшись свойством DataDirectory , определенным в свойстве CurrentDeployment развертывания ApplicationDeployment. Это самый удобный и рекомендуемый способ доступа к данным. В следующем примере кода показано, как сделать это для текстового файла CSV.txt, включенного вами в развертывание в качестве файла данных.
Дополнительные сведения о маркировке файлов в развертывании как файлов данных см. в разделе How to: Include a Data File in a ClickOnce Application.
Можно также получить путь к каталогу данных, используя соответствующие переменные в классе Application , например LocalUserAppDataPath.
Для выполнения операций с другими типами файлов могут потребоваться дополнительные разрешения. Например, если вы хотите использовать файл базы данных Access (. mdb), приложение должно подтвердить полное доверие, чтобы использовать соответствующие <xref:System.Data> классы.
Каталог данных и версии приложения
Каждая версия приложения имеет свой собственный каталог данных, который изолирован от других версий. ClickOnce создает этот каталог, независимо от того, включены ли в развертывание какие-либо файлы данных, чтобы приложению было доступно местоположение для создания новых файлов данных во время выполнения. При установке новой версии приложения ClickOnce копирует все существующие файлы данных из каталога данных предыдущей версии в каталог данных новой версии независимо от того, были ли они включены в первоначальное развертывание или созданы приложением.
ClickOnce заменяет старую версию файла новой версией сервера, если значение хэша для файла данных в старой версии приложения отличается от значения в новой. Кроме того, если в более ранней версии приложения был создан новый файл, который имеет то же имя, что и файл, включенный в развертывание новой версии, ClickOnce перезапишет файл старой версии и использует новый. В обоих случаях старые файлы будут включены в подкаталог внутри каталога данных с именем .pre , так что приложение по-прежнему будет иметь доступ к старым данным в целях миграции.
Если требуется более контролируемая миграция данных, можно использовать API развертывания ClickOnce , чтобы выполнить пользовательскую миграцию из старого каталога данных в новый. Необходимо будет проверить наличие доступной загрузки, воспользовавшись свойством IsFirstRun, загрузить обновление с использованием Update или UpdateAsync, а затем самостоятельно выполнить действия по пользовательской миграции данных по окончании обновления.
Изолированное хранилище
Изолированное хранилище предоставляет API для создания файлов с использованием простого API и осуществления доступа к ним. Фактическое расположение хранимых файлов скрыто от разработчика и пользователя.
Для получения дополнительной информации см. Изолированное хранилище.
Другие локальные файлы
Если приложение должно работать с данными конечных пользователей или сохранять такие данные (отчеты, изображения, музыку и т. д.), приложению потребуется разрешение FileIOPermission для чтения и записи данных в локальной файловой системе.
Удаленные данные
На некотором этапе приложению, скорее всего, необходимо будет извлечь сведения с удаленного веб-сайта, например клиентские данные или информацию о рынке. В этом разделе рассматриваются наиболее распространенные методы получения удаленных данных.
В следующей таблице перечислены стратегии развертывания, которые можно использовать, и их разрешения в Интернете по умолчанию.
Тип развертывания | Сетевые разрешения по умолчанию |
---|---|
Веб-установка | Имеется доступ только к веб-серверу, с которого было установлено приложение |
Установка общей папки | Отсутствует доступ к веб-серверам |
Установка с компакт-диска | Доступны любые веб-серверы |
Если приложению ClickOnce не удается получить доступ к веб-серверу из-за ограничений безопасности, приложение должно подтвердить WebPermission для этого веб-сайта. дополнительные сведения о повышении разрешений безопасности для ClickOnce приложения см. в разделе безопасные ClickOnce приложения.
Доступ к данным через веб-службу XML
Экспериментируя с попыткой опубликовать как бета-версию Foo, так и бета-версию Foo моего приложения через ClickOnce , мне удалось сбить существующую установку Foo и previously-working-fine Foo 1.0.0 (заменив ее Foo Beta 1.0.5, что не работает) из-за использования одного и того же имени GUID, assembly, названия продукта или чего-то еще.
OK, добросовестное заблуждение. В попытке вернуть это, я затем удалил Foo Beta с помощью Windows 7 add/remove programs.
Как я могу привести свой компьютер в состояние, в котором ни Foo , ни Foo Beta никогда не были установлены на нем, чтобы затем я мог пойти и переустановить Foo ?
- Удаление всех соответствующих каталогов foo .exe в разделе %USERPROFILE%/
- Работает mage.exe-cc
- Редактирование HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall и удаление записи для моей программы Foo .
Когда я запускаю установщик, я все равно получаю ошибку. Откуда он находит следы моей программы? И для дальнейшего использования, где это задокументировано?
4 ответа
Этот вопрос уже трижды поднимался в нашей среде. После установки приложения ClickOnce я ожидал, что оно запустится автоматически (как и было настроено после завершения установки), но этого не произошло. Я пытаюсь запустить приложение из ярлыка, и оно вызывает диалоговое окно запуск приложения .
Существует ли установленный способ удалить приложение, которое было развернуто через ClickOnce, используя только онлайн-метод? Я обнаружил, что он находится глубоко в дереве %APPDATA%, но я хочу убедиться, что я полностью поддерживаю его, не создавая будущих проблем при переустановке.
Вы можете попробовать использовать эту команду для очистки кэша ClickOnce:
1) выполнить rundll32 %SystemRoot%\system32\dfshim.dll CleanOnlineAppCache
2) Возможно, вам придется вручную удалить папки ClickOnce deployment,
- В Windows Vista или выше это будет каталог %LocalAppData%\Apps\2.0.
- На Windows XP это будет каталог %USERPROFILE%\Local Settings\Apps\2.0.
3) возможно, Вам также придется выйти из системы и войти обратно
СДЕЛАЙ ЭТО ПО-СТАРОМУ! :D
используйте панель управления "old", чтобы удалить приложение Click Once и переустановить его. Не используйте "новый" интерфейс Windows Ten/2016
EG это GOOD и удалит щелчок один раз:
EG это BAD и приведет вас в круговой ад, если вы используете его для удаления щелчка один раз:
Я хотел бы полностью удалить Docker toolbox с моего Mac. Я попытался удалить Docker из папки /Applications , но это не сработало.
Удаление всех соответствующих каталогов foo.exe в разделе %USERPROFILE%/
Вы также должны заглянуть в папку манифестов
Похожие вопросы:
У меня есть приложение ClickOnce, которым пользуются около 120 клиентов. На этой неделе я узнал, что два клиента отказались от обновления в январе и застряли на старой версии. Я обнаружил это.
У меня есть приложение WinForms, которое собиралось использовать ClickOnce. Но оказалось, что ClickOnce не будет работать для моего приложения, поэтому я хотел бы удалить его. Only. there не.
Я получаю следующую ошибку, когда пытаюсь установить одно из моих приложений ClickOnce: Приложение для этого deployment уже установлено с другим идентификатором приложения. Я понимаю, что это.
Этот вопрос уже трижды поднимался в нашей среде. После установки приложения ClickOnce я ожидал, что оно запустится автоматически (как и было настроено после завершения установки), но этого не.
Существует ли установленный способ удалить приложение, которое было развернуто через ClickOnce, используя только онлайн-метод? Я обнаружил, что он находится глубоко в дереве %APPDATA%, но я хочу.
Я хотел бы полностью удалить Docker toolbox с моего Mac. Я попытался удалить Docker из папки /Applications , но это не сработало.
Как полностью удалить проект ruby on rails с моего компьютера, heroku и github. Я знаю очевидное: удалите файл проекта, удалите РЕПО github и удалите приложение heroku, но есть ли какие-то более.
Я хочу полностью удалить symfony и composer с моего mac. Я гуглил уже пять часов, и никакой документации о том, как полностью удалить composer и symfony с моего mac, найти не удалось. Почему это так.
Я везде искал этот ответ, но все связанные с ним вопросы на SO очень старые. Этот вопрос относится к 2009 году, и лучший (и единственный ответ) состоит из 3 шагов. Действительно? Я имею в виду .
Есть ли способ (подойдет хакер), чтобы позволить пользователю вернуться к предыдущей версии ClickOnce развернутое в сети приложение?
Я посмотрел в документации и API, и, похоже, нет никакого способа. Вы можете выборочно выбирать, хотите ли вы обновить, но после обновления, похоже, обратного пути нет.
ClickOnce будет использовать любую версию, которую вы им отправите. Если вы отправите им старую версию, они вернутся к этой старой версии.
Еще в мае мой приятель Дэвид написал статью о том, как это сделать для каждого пользователя. Мы можем буквально иметь каждого пользователя в другой версии. Приложение даже сообщает базе данных, какую версию хочет пользователь, чтобы теоретически они могли изменить свою версию и затем просто перезапустить приложение.
Вы можете вернуться к более старой версии на стороне сервера, изменив файл манифеста сервера. Когда клиент перезапустит приложение, он увидит, что у него версия отличается от того, что сервер называет «текущей» версией, и он загрузит новую. Этот файл манифеста сервера обычно всегда указывает на самую последнюю версию, но это не обязательно.
Вот как это можно изменить (я опубликовал с использованием Visual Studio 2008. Другие версии могут иметь другую структуру папок публикации).
В той же папке, что и publish.htm, находится XML документ [appName].application . Это файл манифеста на стороне сервера, с которым клиент сравнивает свою текущую версию. В этом документе содержится «текущая» версия, на которой должен работать клиент, а также местоположение на сервере, где можно найти файлы развертывания.
В том же месте, что и publish.htm , также находится папка «Файлы приложений». Эта папка содержит подпапки для каждой из предыдущих публикаций. В каждой из этих подпапок находится другой документ XML с тем же именем, которое я упомянул выше, и называется [appName].application . Скопируйте этот файл (из любой папки, содержащей версию, в которую вы хотите вернуться) и вставьте ее в ту же папку, что и publish.htm (a пару уровней вверх). Когда клиентское приложение перезапускается, оно будет выглядеть так же, как новая версия, загрузите ее и запустите. Теперь клиент будет использовать предыдущую версию.
Вы можете зайти в «Добавить /удалить приложение», выбрать свое приложение и получить последнюю установку.
Вы можете использовать MAGEUI для отката предыдущей версии манифеста на сервере. Проверьте это .
Если вы посмотрите на местоположение развертывания, вы увидите каждую предыдущую версию в отдельной папке с добавленным номером версии, а также с манифестом развертывания, также с добавленным номером версии.
Вы можете переименовать любое из них в текущее развертывание, и в следующий раз, когда вы обновите это приложение, оно получит версию, на которую вы откатились.
Я понимаю алгоритм проверки версии ClickOnce следующим образом:
- Если версия установлена на клиенте = версия развернута на сервере - ничего не делать
- Если версия клиента <версия сервера - обновление
- Если версия клиента> версия сервера:
- Если минимальная версия указана на клиенте> = версия сервера - показать ошибку, как у нас
- Если минимальная версия указана на клиенте <версия сервера - понижение рейтинга
- Если минимальная версия не указана на клиенте - понизить рейтинг
Это можно сделать с помощью рефлексии, если вы знаете издателя URI и имя, язык версии Открытый ключ и архитектура процессора как для развертывания, так и для приложения.
В приведенном ниже коде будет предпринята попытка отката приложения ClickOnce «coolapp.app». Если он не сможет выполнить откат, он попытается удалить его.
Мне просто нужно было сделать одно из них на моем живом производственном сервере, и было приятно иметь все эти заметки. Мое решение было немного другим, и я хотел добавить это как исправление. Перед производственным развертыванием я всегда заранее делаю резервную копию всей содержащей папки. Мне удалось скопировать всю структуру папок обратно в исходное состояние, и все работало нормально.
Осторожно с этим методом:
- Ваша резервная копия будет большой, если приложение довольно большое или в папке с файлами приложения уже опубликовано много версий. Убедитесь, что у вас достаточно места (для меня нет места для хранения).
- Разрешения имеют неприятную тенденцию кусать вас таким образом. Убедитесь, что ваше местоположение развертывания размещено для внешнего доступа, что вы проверяете все разрешения до и после восстановления.
- Мне было полезно перерабатывать пул приложений в IIS .
Просто использовал это для отката приложения clickonce, разработанного в Visual Studio 2017. В моем случае в корневой папке было всего два файла; один называется [applicationName] .manifest, другой setup.exe.
[applicationName] .manifest содержал числовые ссылки на текущий номер версии, но каждый из них был связан со значением publicKeyToken, поэтому я не хотел его редактировать вручную.
Итак, в папке «Файлы приложения» в подпапке с версией, которую я хотел откатить, я обнаружил еще один [applicationName] .manifest, который я скопировал в корневую папку (создав резервную копию оригинала).
И это было все. Это сработало для меня и было действительно простым решением. Однако я не использую минимально требуемую версию, поэтому не могу сказать, повлияет ли это на нее.
Теперь немного опишем картину.
Есть WPF приложение. приличное такое приложение которое весит примерно 30 Мб, постоянно обновляемая часть которого примерно 10-15 Мб, это как вы поняли благодаря тому что ClickOnce умеет умно выбирать то что надо обновить, а то что не менялось он не качает. Так же имеем сеть пользователей которые разбросаны по всей России, порядка пятисот пользователей. Эти пользователи подключены к серверу обновлений через защищенный корпоративный VPN канал. В приложение встроен механизм авто обновления основанный на стандартном ClickOnce API, механизм общеизвестный и вы его можете так же в указанных статьях увидеть, поэтому приведу только лишь код проверки наличия самого обновления чтобы было на что ссылаться в дальнейшем.
updateCheck = ApplicationDeployment.CurrentDeployment; MessageBox.Show("Не возможно проверить наличие обновлений");Класс ApplicationDeployment прекрасная весч и не менее прекрасно справляется с поставленными перед ним задачами с некоторыми незначительными оговорками, но к сожалению разработчики закрыли возможность хоть как то повлиять на процесс обновления и сделали его полностью ReadOnly. Я согласен что это правильно и очень секурно, но приводит к небольшим неудобствам в дальнейшем о которых далее. Еще скажу что проверка обновлений работает по стандартному шаблону, то есть в определенный промежуток времени проверяет обновления на сервере и при наличии оных закачивает их в фоновом режиме, а по окончании просит пользователя перезапустить обновленное приложение.
Теперь как раз о проблеме
Как говорилось ранее порядка пятисот пользователей периодически лезут на сервер в надежде получить свежую программу. и пока выкладывание происходит в штатном режиме то есть вечером предыдущего дня все идет хорошо. То есть пользователи с учетом разности времени в регионах, разности начала рабочего дня и прочих мелких причин поочередно обновляют программу и получив свою порцию счастья спокойно работают. Но так как никто не застрахован от случайностей и ошибок иногда случается что в результате критической ошибки надо пере выложить версию программы. Вот тут начинается страшное, вся эта толпа вожделеющих пользователей рвется со страшной силой на бедный и одинокий сервер обновлений который никак не способен одновременно удовлетворить такое количество пользователей и поэтому начинает их по очереди отпуливать. Далее обиженная толпа с новой силой бросается на атаку сервера и все повторяется и повторяется.
Вариант с расширением канала не катит, так как по понятным причинам делать это до бесконечности не возможно, так как же тогда быть? Единственная разумная мысль тут конечно же сделать несколько альтернативных серверов обновления и даже возможно определенным группам пользователей прописать свои сервера обновлений. Но так как в манифесте дозволенно прописать только один источник обновлений придется выкладывать несколько одинаковых версий приложения на несколько серверов с разными источниками обновлений в файле манифеста. Но давайте сразу договоримся что на самом деле это костыль и даже при возможности автоматизировать данное действие это дополнительное место возникновения ошибки. Невозможность указать при настройке ClickOnce альтернативные источники обновления приложения это серьезный недостаток, тем более если не изменяет память то в первых статьях об этой технологии его же создателями был сделан акцент на эту возможность и обещалось дать такую возможность в будущем, но видать время еще не пришло. Но есть Extention к API который позволяет инициировать проверку обновлений с явным указанием источника и выглядит это примерно так
Здесь первой строкой создаем отдельный хитрый экземпляр Deployment объекта которому второй строкой указываем новый источник. Второй параметр указывает на то является ли указанный объект ярлыком (ссылкой). Третья строка непосредственно инициирует проверку обновления, но с параметром я не особо разобрался, так как нигде не нашел внятного его описания, но на сколько понял это просто внутренний идентификатор процесса. Так вот, данная хитрость вроде даже как бы и сработало, но даже если в uriPath подставить путь из которого приложение устанавливалось то при попытке обновления возникает ошибка чтения файла манифеста. Вот тут как раз то самое место где я ударился головой о незримое препятствие, вроде как бы вот она проблема на поверхности, но все попытки решения заканчиваются неудачей. Ни одного примера работы с DeploymentServiceCom найти не удалось, нигде нет ясного описания как реально в данном случае должен быть модифицирован манифест приложения.
Читайте также: