Запуск приложения ClickOnce из другого приложения ClickOnce
Моя цель - фактически запустить запуск приложения ClickOnce за один клик (или два, я думаю). Приложение имеет некоторые предварительные условия, которые необходимо установить. Нормальный способ обеспечения их установки, который предоставляет Microsoft, заключается в том, что пользователь решил, имеет ли он предварительные условия или нет, и загружает и устанавливает "setup.exe", который устанавливает их и запускает приложение ClickOnce. Это включает загрузку EXE файла (один клик), запуск (два щелчка), затем после установки необходимых условий, повторное нажатие для запуска приложения ClickOnce.
Я пытаюсь уменьшить этот процесс до одного или двух кликов:
- Нажмите ссылку на моем веб-сайте в файл ClickOnce .application
.
- Нажмите еще раз, чтобы запустить его.
Я сделал ДРУГОЕ приложение ClickOnce, которое включает setup.exe. Он проверяет, установлены ли предварительные условия, и если они запускают другое приложение ClickOnce автоматически. Если нет, он запускает включенный файл setup.exe, а затем запускает другое приложение ClickOnce.
Моя проблема в том, что когда я пытаюсь запустить другое приложение ClickOnce из этого, он просто открывает мой веб-браузер и загружает файл .plplication без его запуска.
Я пытаюсь использовать следующее, чтобы запустить приложение ClickOnce из моего кода С#:
Process.Start(ApplicationURL);
Я просто хочу, чтобы это автоматически запускало приложение в ApplicationURL. Есть ли способ пропустить браузер, который я вижу?
(Мой вопрос очень похож на вопрос о переполнении стека Запустите приложение ClickOnce с веб-страницы без действий пользователя).
Ответы
Ответ 1
Как указано в комментариях, вы можете запустить процесс iexplore.exe
для запуска приложения ClickOnce без какой-либо зависимости от браузера по умолчанию. Вы также можете запустить приложение ClickOnce так же, как Windows Explorer запустит его, используя dfshim.dll
.
Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " + ApplicationURL);
Есть несколько других статей в Интернете, в которых обсуждается использование этой стратегии, но я не нашел официальной документации dfshim.dll, ShOpenVerbApplication.
- Еще один вопрос упоминает использование пользовательского .exe для установки .NET Framework, а затем запускает приложение ClickOnce через ShOpenVerbApplication.
- Scott Hanselman обсуждает ShOpenVerbApplication как сопоставление файлов по умолчанию для файлов с типом MIME приложения/x-ms-приложения в сообщении о Firefox и ClickOnce.
Обновление
Как упоминается в другом вопросе о переполнении стека, вы также можете использовать команду dfshim.dll
LaunchApplication
, которая задокументирована на сайте Microsoft. Однако эта команда недоступна в некоторых старых версиях .NET Framework.
Ответ 2
Посмотрите прохождение Microsoft для установки вручную через InPlaceHostingManager. У вас есть возможность настроить программно.
Ответ 3
Есть как минимум 2 других способа запуска приложений ClickOnce.
Одним из простых методов является Process.Start("PresentationHost.exe", "-launchApplication " + ApplicationURL);
, как описано в документации Microsoft здесь.
Более сложный метод вызывает ShellExecuteEx() Win32 API со следующим кодом:
SHELLEXECUTEINFO info = new SHELLEXECUTEINFO();
info.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(info);
info.lpFile = ApplicationURL;
info.nShow = SW_SHOWNORMAL;
info.fMask = SEE_MASK_CLASSNAME;
info.lpClass = "Application.Manifest";
ShellExecuteEx(ref info);
Обязательные определения импорта и структуры Win32 API можно найти здесь. Этот метод запросит реестр и запустит "rundll32.exe dfshim.dll, ShOpenVerbApplication" (или все остальное, что настроено в HKEY_CLASSES_ROOT\Application.Manifest).
Ответ 4
Ниже приведены способы запуска clickonce.application
.Подход 1: запуск с URL
Метод 1:
string app = "http://domain.xyz/ClickOnce.application";
Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " + app);
Метод 2:
string app = "http://domain.xyz/ClickOnce.application";
Process.Start("IExplore.exe", app);
Подход 2: Прямой запуск ClickOnce.application из файла .application
string app = "file://C:/ClickOnce.application";
Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " + app);