Clickonce где хранятся файлы после установки

Обновлено: 05.07.2024

Технология развертывания приложения ClickOnce позволяет Вам создать самостоятельно обновляющиеся приложения Windows, которые могут быть установлены и запущены с минимальными усилиями со стороны пользователя. Публикация ClickOnce призвана преодолеть 3 главные проблемы, свойственные традиционным методам развертывания/установки приложения:

Сложность в обновлении приложений . При развертывании с помощью Microsoft Windows Installer всякий раз, когда обновляется приложение, пользователь должен переустановить все приложение полностью, что обычно требует административных привилегий. При развертывании ClickOnce обновления можно предоставлять автоматически. Загрузятся только те части приложения, которые были изменены, и затем полное, обновленное приложение будет заново установлено в новой папке.
Нежелательное воздействие на компьютер пользователя . При развертывании с помощью Microsoft Windows Installer приложения часто полагаются на использование общих программных компонентов, что потенциально приводит к конфликтам версий. При развертывании ClickOnce каждое приложение содержит в себе все необходимое, и никак не влияет на другие приложения.
Безопасность, права доступа . Windows Installer при установке требует наличия прав администратора, для обычного пользователя разрешена только ограниченная установка. ClickOnce дает возможность пользователям с ограниченными привилегиями устанавливать приложение, и дает только разрешение Code Access Security, необходимое для приложения.

В прошлом эти проблемы иногда заставляли разработчиков создавать Web-приложения вместо приложений Windows, принося в жертву богатый возможностями, отзывчивый графический интерфейс Windows Forms с целью избавиться от проблем с инсталляцией и обновлениями. С приложениями, развертываемыми через ClickOnce, Вы получаете лучшее от обоих этих техник.

Что из себя представляет приложение ClickOnce? Установлено, что ClickOnce применяется для развертывания любых приложений Windows Presentation Foundation (WPF), Windows Forms или консольных (приложений командной строки). Вы можете публиковать приложение ClickOnce тремя разными способами: с Web-станицы, с сетевой общей папки (network file share), или с любого носителя данных наподобие папки на диске или CD-ROM. Приложение ClickOnce может быть установлено на компьютере пользователя, и запущено на нем локально даже тогда, когда этот компьютер отключен от сети (offline), или даже приложение может быть запущено только в режиме подключения к сети (online-only mode), без какой-либо постоянной установки на компьютер пользователя. Для получения дополнительной информации см. [2].

Приложения ClickOnce могут обновлять сами себя; они могут проверять наличие более новой версии, и автоматически заменить любые обновленные файлы. Разработчик может задать поведение обновления; администратор сети также может управлять стратегиями обновлений, например помечая обновление как обязательное. Обновления также можно откатить назад к предыдущей версии конечным пользователем или администратором [2].

Из-за того, что приложения ClickOnce по сути изолированы (не влияют на общую рабочую среду и мало зависят от неё), инсталляция или запуск приложения ClickOnce не может повредить существующие приложения. Приложения ClickOnce полностью самодостаточны; каждое приложение ClickOnce устанавливается и запускается безопасно, индивидуально для каждого пользователя, потому что для каждого пользователя существует отдельная копия приложения в кэше приложения, находящемся в профиле пользователя. По умолчанию приложения ClickOnce запускаются в зонах безопасности Internet (внешняя общая мировая сеть) или Intranet (большая внутренняя сеть организации). Если это необходимо, приложение может выдать запрос на повышение привилегий (request elevated security permissions, см. [3]).

Как работает развертывание ClickOnce. Ядро архитектуры публикации ClickOnce основано на 2 файлах манифеста XML: application manifest и deployment manifest.

Примечание: Publish Wizard в Microsoft Visual Studio 2005 также генерирует deployment manifest.

После того, как deployment manifest создан, он копируется в место развертывания (deployment location). Это может быть Web-сервер, общая сетевая папка или носитель данных наподобие CD. Application manifest и все файлы приложения также копируются в место развертывания, которое указывается в deployment manifest. Это может быть то же самое место, что и место развертывания, или это может быть другое место. Когда используется мастер публикации (Publish Wizard) в Microsoft Visual Studio 2005, эти операции копирования выполняются автоматически.

Примечание: если разработчик является также и администратором, т. е. имеет привилегии Administrator для Web-сайта или общей сетевой папки (file share), куда будет копироваться deployment manifest, то этот манифест представляет все, что требуется. Если разработчик не администратор, то администратор должен использовать инструмент командной строки чтобы обновить и подписать манифест.

После того, как deployment manifest размещен в место развертывания, конечные пользователи могут загрузить и установить приложение кликом на иконку, представляющую файл deployment manifest на Web-страничке или в папке. Для большинства случаев конечному пользователю показывается простое окно диалога, запрашивающее подтверждение инсталляции, после чего без всяких дополнительных вопросов начнется инсталляция, после чего установленное приложение автоматически запустится. В случаях, когда приложению требуется повышение привилегий (elevated permissions), окно диалога запросит у пользователя разрешение на предоставления разрешения, после чего установка может продолжится.

После установки приложение добавляется в меню Пуск (Start menu) и в список установленных приложений (Add/Remove Programs group) Панели Управления операционной системы Windows (Control Panel). В отличие от других технологий развертывания, ничего не добавляется ни в папку Program Files, ни в реестр, ни на рабочий стол, и для инсталляции не требуется административных привилегий.

Примечание: есть возможность предотвратить добавление приложения в меню Пуск и в список установленных приложений, в результате получится эффект поведения наподобие Web-приложения [2].

Когда разработчик приложения создает обновленную версию приложения, он также генерирует новый application manifest, и копирует файлы в место развертывания - обычно это папка одного и того же уровня по отношению к оригинальной папке развертывания приложения. Администратор обновляет deployment manifest, чтобы указать на место размещения новой версии приложения.

Примечание: для выполнения этих шагов может использоваться Publish Wizard из Microsoft Visual Studio 2005.

В дополнение к месту развертывания deployment manifest также содержит место нахождения обновления (update location, это может быть Web-страничка или общая сетевая папка, network file share), где приложение проверяет наличие обновленных версий. Свойства публикации (ClickOnce Publish) также используются для для указания, когда и как часто приложение должно проверять наличие обновлений. Поведение обновления может быть задано в deployment manifest, или это может быть представлено как выбор пользователя в интерфейсе самого приложения с помощью ClickOnce API. Дополнительно свойства публикации могут сделать обновления обязательными, или можно задать откат к более ранней версии [5].

В следующей таблице сравниваются возможности техники развертывания ClickOnce и традиционной техники установки Windows Installer:

(1) При использовании Windows Installer Вы должны реализовать обновление программно в коде приложения.
(2) При использовании ClickOnce откат назад доступен в стандартной оснастке Установка и удаление программ (Add/Remove Programs).
(3) Развертывание ClickOnce может получить доступ к ветви реестра HKEY_LOCAL_MACHINE (HKLM) только с наличием разрешения полного доверия (Full Trust permission).

Большинство приложений потребляют или производят данные. 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

У меня есть коллекция пакетов ClickOnce в папке публикации на сетевом диске и нужно переместить их все на другой сервер (наша DR-машина).

Как только я изменю установку URL-адресом чтобы указать на мою новую машину, я получаю еще одну ошибку:

XML-подпись Манифеста недопустима.

+ цифровая подпись объекта не проверена.

Я пробовал использовать MageUI.exe, чтобы изменить URL-адрес развертывания, но он запрашивает сертификат, которого у меня нет.

Что я делаю неправильно и как успешно перемещать опубликованные пакеты ClickOnce?

Я нашел решение:

во-первых, используя MageUI, я изменил "начальное местоположение" в разделе "Параметры развертывания". При сохранении он побудил меня подписать ключ, который я создал там и тогда. Затем я запустил setup.exe файл, и он работал в обязательном порядке.

после проверки, какие файлы были изменены, я понял, что это был только один файл: файл манифеста приложения ( myAppName.application ). Единственное, что изменилось в файле, было развертывание поставщик и подпись (это то, что я изменил в MageUI).

как только я понял, как это сделать, я использовал версию командной строки MageUI под названием Mage.exe , который поставляется с SDK.

ниже есть пакетный файл, который я создал, чтобы сделать все это в командной строке:

REM установить окружающую среду
звоните "C:\Program файлы\Microsoft Visual Studio 9.0\VC\vcvarsall.летучая мышь"

REM обновить URL-адрес поставщика развертывания
маг -обновление %1.применение-pu %2

REM подписать манифест с нашим ключом
маг -знак %1.приложение-CertFile C:\AppKey - . pfx-файл -пароль myPw

Теперь я могу использовать это для быстрого и простого запуска всех моих опубликованных приложений. Надеюсь, это поможет.

Не вдаваясь в подробности, это должно заставить вас идти.

манифесты ClickOnce должны быть подписаны сертификатом по соображениям безопасности. Вы можете приобрести сертификат подписи кода или создать тестовый сертификат. Основным недостатком тестового сертификата является то, что издатель приложения будет отображаться как "неизвестный", а не Название вашей компании.

в Visual Studio откройте свойства проекта и перейдите на вкладку "подписание", выберите " подписать ClickOnce манифесты " и "создать тестовый сертификат". Затем нажмите "Подробнее", Чтобы открыть диалоговое окно, и нажмите"Установить сертификат". Это проведет вас через Мастер, чтобы получить сертификат теста в вашем магазине. Убедитесь, что вы положили его в "личный" магазин.

теперь вы можете использовать MageUI для редактирования манифестов. В любое время вы сохраните его предложит вам подписать манифесты, но теперь вы должны иметь возможность выбрать тестовый сертификат вы только что сохранили. Всегда редактируйте / подписывайте манифест приложения редактирование/подписание манифеста развертывания. Это сбивает с толку, потому что манифест приложения не файл .применение

Я ожидал бы сделать следующее:

  • скопировать содержимое папки в новое местоположение
  • для каждого приложения:-
    • изменить "папку установки" на новое место
    • опубликовать в новой версии изменить в новом месте

    новые настройки, выполняемые из новой папки, должны работать, а существующие-обновляться искать в нужном месте.

    все это непроверено, но я уверен, что это то, что я сделал ранее.

    очевидно, вам придется запускать их параллельно в течение определенного времени, но, поскольку это внутреннее приложение, худшее, что произойдет, когда Вы наконец переключитесь на новое место, - это то, что вам придется сообщить пользователю о новом месте, чтобы получить "фиксированное" приложение

    Я верю, что у вас есть сертификат. Он нужен для создания развертывания ClickOnce. Visual Studio может автоматически создать самозаверяющий для вас. Я не слишком хорошо знаком с процессом, надеюсь, кто-то с более окончательным ответом будет скинуться. Кроме того, вы пробовали инструмент MageUI, возможно, будет более очевидно, что вам нужно сделать с помощью GUI.

    Мне нужно написать файл в той же папке, где находится консоль ClickOnce .application (исполняемый файл). Папка, из которой он запускается.

    Я пытался использовать Application.StartupPath &, Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) но путь указывает на подпапку в c:\Documents & Settings . Как мне получить путь, где .application находится?

    Чтобы найти местоположение папки, вы можете просто запустить приложение, открыть диспетчер задач (CTRL-SHIFT-ESC), выбрать приложение и щелкнуть правой кнопкой мыши | Открыть местоположение файла.

    эй, про совет! но это не доступно на старых дрянных машинах XP. :) Как этого добиться в приложении, работающем на компьютере клиента? Что делать, если я не могу запустить приложение, потому что оно удалит файл журнала, который мне крайне необходим? @Tony_Henrich Вы должны пометить это как правильный ответ

    путь указывает на подпапку в папке c: \ Documents & Settings

    Это правильно. ClickOnce applications установлены под профилем пользователя, который их установил. Вы взяли путь, который дал вам извлечение информации из исполняющей сборки, и пошли проверить это?

    В Windows Vista и Windows 7 вы найдете кеш ClickOnce здесь:

    В Windows XP вы найдете это здесь:

    Я все это понимаю. Я хочу папку, откуда я нажал на приложение. У меня нет доступа к C: \ Documents and Settings, поэтому у меня не будет доступа к файлу журнала, если я собираюсь использовать путь к папке, возвращенный этой функцией, и я не хочу использовать жестко закодированные значения пути ,

    «Строка нулевой длины, если свойство TrustUrlParameters в манифесте развертывания имеет значение false или если пользователь предоставил UNC для открытия развертывания или открыл его локально. В противном случае возвращаемое значение представляет собой полный URL-адрес, используемый для запуска приложения, включая любые параметры. "

    НО я думаю, что вы действительно хотите, это ApplicationDeployment.CurrentDeployment.DataDirectory, которая дает вам папку, в которую вы можете записывать данные. В любом случае, когда вы обновите приложение, вы потеряете то, что было в исходной папке .exe, но вы можете перенести каталог данных в новую версию приложения. Ваше приложение может записывать в эту папку любые файлы журналов, которые оно имеет - и я уверен, что оно гарантированно доступно для записи.

    Однако вам не следует писать ни в одну папку, в которой ваше приложение развернуто, независимо от метода развертывания (xcopy, ClickOnce, InstallShield и т. Д.), Поскольку они обычно читаются только для приложений, особенно в новых версиях Windows и серверных средах.

    Т.е. для данных, журналов и других файлов можно использовать ApplicationData (роуминг), LocalApplicationData (локальный) или CommonApplicationData . Для временных файлов используйте Path.GetTempPath или Path.GetTempFileName .

    Вышеперечисленное работает и на серверах, и на десктопах.

    РЕДАКТИРОВАТЬ: Assembly.GetExecutingAssembly() вызывается в основном исполняемом файле.

    Это работает для меня в приложении ClickOnce, а также в среде VS dev при отладке того же приложения.

    ClickOnce приложения DO проживают в подкаталоге C: \ Documents & Settings. У них нет «чистых» установочных каталогов, потому что локальные файлы по существу «временно» загружаются, чтобы позволить приложению запускаться на локальном ПК, а выполнение приложения контролируется с сервера ClickOnce, на котором они развернуты, в зависимости от настроек публикации. (Проверка наличия обновлений, требований к версии и т. Д.).

    У меня нет доступа к папке C: \ Documents & Settings на сервере, что означает, что у меня нет доступа к файлу, который создает приложение. Я запускаю приложение из определенной папки. Это папка, в которой опубликовано приложение. Как мне получить путь к этой папке? О, вы хотите URL развертывания. Извини, я этого совсем не понял. Вы пытаетесь получить его из приложения ClickOnce или из внешнего приложения?

    Вот что я обнаружил, и это помогло мне найти расположение развернутой папки моего приложения clickonce, и это нигде не было упомянуто в моих поисках для моего похожего специфического сценария:

    • Приложение clickonce развернуто в сетевой папке компании.
    • Приложение clickonce должно быть доступно онлайн или офлайн.
    • Мои URL-адреса установки clickonce и URL-адреса обновлений в свойствах моего проекта не указаны. То есть нет отдельного места для установки или обновления.
    • В моих опциях публикации у меня есть ярлык на рабочем столе, созданный для приложения clickonce.
    • Папка, для которой я хочу получить путь при запуске, является папкой, к которой я хочу получить доступ в версиях приложения DEV, INT и PROD, без жесткого определения пути.

    Вот изображение моего варианта использования:

    введите описание изображения здесь

    • Папки в синей рамке - это мои каталоги для каждого приложения среды.
    • Красная папка в штучной упаковке - это каталог, для которого я хочу получить путь (для этого необходимо сначала получить местоположение развернутой папки приложения «MyClickOnceGreatApp_1_0_0_37», которое совпадает с OP).

    Я не нашел ни одного из предложений в этом вопросе или их комментариев для работы по возвращению папки, в которой было развернуто приложение clickonce (которую я затем переместил бы относительно этой папки, чтобы найти интересующую папку). Никакой другой интернет-поиск или связанные с этим вопросы так же не нашли ответа.

    Все предложенные свойства либо не работали из-за того, что объект (например, ActivationUri) был нулевым, либо указывали на кешированную папку установленного приложения на локальном ПК. Да, я мог бы изящно обрабатывать нулевые объекты путем проверки IsNetworkDeployed - это не проблема - но удивительно, что IsNetworkDeployed возвращает false, даже если у меня действительно есть расположение развернутой в сети папки для приложения clickonce. Это связано с тем, что приложение выполняется из локальных кэшированных битов.

    Решение состоит в том, чтобы посмотреть на:

    • AppDomain.CurrentDomain.BaseDirectory когда приложение запускается в Visual Studio, как я разрабатываю и
    • System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation когда он выполняется нормально.

    System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation правильно возвращает сетевой каталог, в котором развернуто мое приложение clickonce, во всех случаях. То есть когда он запускается через:

    • setup.exe
    • MyClickOnceGreatApp.application
    • Ярлык на рабочем столе, созданный при первой установке и запуске приложения.

    Вот код, который я использую при запуске приложения, чтобы получить путь к папке WorkAccounts. Получить папку развернутого приложения просто, просто не переходя к родительским каталогам:

    Читайте также: