Подтвердить что ты не робот

Запуск приложения 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 с веб-страницы без действий пользователя).

4b9b3361

Ответ 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.

Ответ 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);