Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Alla ClickOnce-program som baseras på en .exe fil kan installeras tyst och uppdateras av ett anpassat installationsprogram. Ett anpassat installationsprogram kan implementera anpassad användarupplevelse under installationen, inklusive anpassade dialogrutor för säkerhets- och underhållsåtgärder. För att utföra installationsåtgärder använder den anpassade installationsklass InPlaceHostingManager. Den här genomgången visar hur du skapar ett anpassat installationsprogram som tyst installerar ett ClickOnce-program.
Anmärkning
Klassen ApplicationDeployment och API:erna System.Deployment.Application i namnområdet stöds inte i .NET Core- och .NET 5- och senare versioner. I .NET 7 stöds en ny metod för att komma åt egenskaper för programdistribution. Mer information finns i Access ClickOnce distributionsegenskaper i .NET. .NET 7 stöder inte motsvarigheten till ApplicationDeployment-metoder.
Förutsättningar
Så här skapar du ett anpassat ClickOnce-programinstallationsprogram
I ditt ClickOnce-program lägger du till referenser till System.Deployment och System.Windows.Forms.
Lägg till en ny klass i ditt program och ange valfritt namn. Den här genomgången använder namnet
MyInstaller.Lägg till följande
Importsellerusingdirektiv överst i den nya klassen.Lägg till följande metoder i klassen.
Dessa metoder anropar InPlaceHostingManager metoder för att ladda ned distributionsmanifestet, kontrollera lämpliga behörigheter, be användaren om behörighet att installera och sedan ladda ned och installera programmet i ClickOnce-cachen. Ett anpassat installationsprogram kan ange att ett ClickOnce-program är förhandsbetrott, eller kan skjuta upp beslutet om förtroende till metodanropet AssertApplicationRequirements. Den här koden litar på programmet i förväg.
Anmärkning
Behörigheter som tilldelas av förhandsförtroende får inte överskrida behörigheterna för den anpassade installationskoden.
InPlaceHostingManager iphm = null; public void InstallApplication(string deployManifestUriStr) { try { Uri deploymentUri = new Uri(deployManifestUriStr); iphm = new InPlaceHostingManager(deploymentUri, false); } catch (UriFormatException uriEx) { MessageBox.Show("Cannot install the application: " + "The deployment manifest URL supplied is not a valid URL. " + "Error: " + uriEx.Message); return; } catch (PlatformNotSupportedException platformEx) { MessageBox.Show("Cannot install the application: " + "This program requires Windows XP or higher. " + "Error: " + platformEx.Message); return; } catch (ArgumentException argumentEx) { MessageBox.Show("Cannot install the application: " + "The deployment manifest URL supplied is not a valid URL. " + "Error: " + argumentEx.Message); return; } iphm.GetManifestCompleted += new EventHandler<GetManifestCompletedEventArgs>(iphm_GetManifestCompleted); iphm.GetManifestAsync(); } void iphm_GetManifestCompleted(object sender, GetManifestCompletedEventArgs e) { // Check for an error. if (e.Error != null) { // Cancel download and install. MessageBox.Show("Could not download manifest. Error: " + e.Error.Message); return; } // bool isFullTrust = CheckForFullTrust(e.ApplicationManifest); // Verify this application can be installed. try { // the true parameter allows InPlaceHostingManager // to grant the permissions requested in the application manifest. iphm.AssertApplicationRequirements(true) ; } catch (Exception ex) { MessageBox.Show("An error occurred while verifying the application. " + "Error: " + ex.Message); return; } // Use the information from GetManifestCompleted() to confirm // that the user wants to proceed. string appInfo = "Application Name: " + e.ProductName; appInfo += "\nVersion: " + e.Version; appInfo += "\nSupport/Help Requests: " + (e.SupportUri != null ? e.SupportUri.ToString() : "N/A"); appInfo += "\n\nConfirmed that this application can run with its requested permissions."; // if (isFullTrust) // appInfo += "\n\nThis application requires full trust in order to run."; appInfo += "\n\nProceed with installation?"; DialogResult dr = MessageBox.Show(appInfo, "Confirm Application Install", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); if (dr != System.Windows.Forms.DialogResult.OK) { return; } // Download the deployment manifest. iphm.DownloadProgressChanged += new EventHandler<DownloadProgressChangedEventArgs>(iphm_DownloadProgressChanged); iphm.DownloadApplicationCompleted += new EventHandler<DownloadApplicationCompletedEventArgs>(iphm_DownloadApplicationCompleted); try { // Usually this shouldn't throw an exception unless AssertApplicationRequirements() failed, // or you did not call that method before calling this one. iphm.DownloadApplicationAsync(); } catch (Exception downloadEx) { MessageBox.Show("Cannot initiate download of application. Error: " + downloadEx.Message); return; } } /* private bool CheckForFullTrust(XmlReader appManifest) { if (appManifest == null) { throw (new ArgumentNullException("appManifest cannot be null.")); } XAttribute xaUnrestricted = XDocument.Load(appManifest) .Element("{urn:schemas-microsoft-com:asm.v1}assembly") .Element("{urn:schemas-microsoft-com:asm.v2}trustInfo") .Element("{urn:schemas-microsoft-com:asm.v2}security") .Element("{urn:schemas-microsoft-com:asm.v2}applicationRequestMinimum") .Element("{urn:schemas-microsoft-com:asm.v2}PermissionSet") .Attribute("Unrestricted"); // Attributes never have a namespace if (xaUnrestricted != null) if (xaUnrestricted.Value == "true") return true; return false; } */ void iphm_DownloadApplicationCompleted(object sender, DownloadApplicationCompletedEventArgs e) { // Check for an error. if (e.Error != null) { // Cancel download and install. MessageBox.Show("Could not download and install application. Error: " + e.Error.Message); return; } // Inform the user that their application is ready for use. MessageBox.Show("Application installed! You may now run it from the Start menu."); } void iphm_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { // you can show percentage of task completed using e.ProgressPercentage }Anropa
InstallApplication-metoden för att försöka initiera installationen från din kod. Om du till exempel gav klassenMyInstallernamnet kan du anropaInstallApplicationpå följande sätt.
Nästa steg
Ett ClickOnce-program kan också lägga till anpassad uppdateringslogik, inklusive ett anpassat användargränssnitt som ska visas under uppdateringsprocessen. Mer information finns i UpdateCheckInfo. Ett ClickOnce-program kan också utelämna standardposten startmeny, genväg och lägg till eller ta bort program med hjälp av ett <customUX> element. För mer information, se <entryPoint>-elementet och ShortcutAppId.