[英]Launching a ClickOnce application from another ClickOnce application
我的目標是真正實現一鍵啟動我的 ClickOnce 應用程序(或者我猜是兩次)。 該應用程序有一些需要安裝的先決條件。 Microsoft 提供的確保安裝它們的正常方法包括讓用戶決定他是否具有先決條件,然后下載和安裝“setup.exe”,該“setup.exe”會安裝它們並運行 ClickOnce 應用程序。 這包括下載 EXE 文件(單擊一次)、運行它(單擊兩次),然后在安裝了先決條件后,再次單擊以運行 ClickOnce 應用程序。
我試圖將這個過程減少到一兩次點擊: - 點擊我網站上指向 ClickOnce .application
文件的鏈接。 - 再次單擊以運行它。
我制作了另一個 ClickOnce 應用程序,其中包括一個 setup.exe。 它檢查是否安裝了先決條件,如果已安裝,它會自動運行其他 ClickOnce 應用程序。 如果沒有,它會運行包含的 setup.exe,然后運行其他 ClickOnce 應用程序。
我的問題是,當我嘗試從該應用程序運行另一個 ClickOnce 應用程序時,它只是打開我的網絡瀏覽器並下載 .application 文件而不運行它。
我正在嘗試使用以下內容從我的 C# 代碼中啟動 ClickOnce 應用程序:
Process.Start(ApplicationURL);
我只想讓它在 ApplicationURL 自動啟動應用程序。 有沒有辦法跳過我看到的瀏覽器參與?
(我的問題非常類似於 Stack Overflow 問題Run a ClickOnce application from a pages without user action )。
正如評論中所指出的,您可以啟動iexplore.exe
進程來啟動 ClickOnce 應用程序,而不依賴於默認瀏覽器。 您還可以使用dfshim.dll
啟動 ClickOnce 應用程序,就像 Windows 資源管理器啟動它一樣。
Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " + ApplicationURL);
網上還有其他幾篇文章討論了使用這種策略,但是我沒有找到 dfshim.dll,ShOpenVerbApplication 的任何官方文檔。
更新
正如另一個 Stack Overflow 問題所提到的,您還可以使用dfshim.dll
的LaunchApplication
命令,該命令記錄在 Microsoft 的網站上。 但是,該命令在某些舊版本的 .NET Framework 中不可用。
至少有 2 種其他方法可以啟動 ClickOnce 應用程序。
一種簡單的方法是Process.Start("PresentationHost.exe", "-launchApplication " + ApplicationURL);
正如微軟在此處記錄的那樣。
更復雜的方法是調用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下配置的任何其他內容)。
查看通過InPlaceHostingManager手動安裝的Microsoft 演練。 您可以以編程方式進行自定義。
以下是啟動 clickonce.application 的方法
方法 1:從 URL 啟動
方法一:
string app = "http://domain.xyz/ClickOnce.application";
Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " + app);
方法二:
string app = "http://domain.xyz/ClickOnce.application";
Process.Start("IExplore.exe", app);
方法 2:直接從 .application 文件啟動 ClickOnce.application
string app = "file://C:/ClickOnce.application";
Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " + app);
另一種選擇是使用Launcher::LaunchUriAsync和 LauncherOptions.ContentType = "application/x-ms-application"。 這稱為“uri 直接調用”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.