İzlenecek yol: ClickOnce uygulaması için özel yükleyici oluşturma
bir .exe dosyasını temel alan tüm ClickOnce uygulamaları özel bir yükleyici tarafından sessizce yüklenebilir ve güncelleştirilebilir. Özel yükleyici, güvenlik ve bakım işlemleri için özel iletişim kutuları da dahil olmak üzere yükleme sırasında özel kullanıcı deneyimi uygulayabilir. Yükleme işlemlerini gerçekleştirmek için özel yükleyici sınıfını InPlaceHostingManager kullanır. Bu kılavuzda, bir ClickOnce uygulamasını sessizce yükleyen özel bir yükleyicinin nasıl oluşturulacağı gösterilmektedir.
Not
ApplicationDeployment Ad alanı içindeki System.Deployment.Application sınıf ve API'ler .NET Core ve .NET 5 ve sonraki sürümlerde desteklenmez. .NET 7'de, uygulama dağıtım özelliklerine erişmek için yeni bir yöntem desteklenir. Daha fazla bilgi için bkz . .NET'te ClickOnce dağıtım özelliklerine erişme. .NET 7, ApplicationDeployment yöntemlerinin eşdeğerini desteklemez.
Önkoşullar
Özel clickOnce uygulama yükleyicisi oluşturmak için
ClickOnce uygulamanızda System.Deployment ve System.Windows.Forms'a başvurular ekleyin.
Uygulamanıza yeni bir sınıf ekleyin ve herhangi bir ad belirtin. Bu kılavuzda adı
MyInstaller
kullanılır.Aşağıdaki
Imports
veyausing
yönergelerini yeni sınıfınızın en üstüne ekleyin.Sınıfınıza aşağıdaki yöntemleri ekleyin.
Bu yöntemler dağıtım bildirimini indirmek, uygun izinleri onaylamak, kullanıcıdan yükleme izni istemek ve ardından uygulamayı Indirip ClickOnce önbelleğine yüklemek için yöntemleri çağırır InPlaceHostingManager . Özel yükleyici bir ClickOnce uygulamasının önceden güvenilir olduğunu belirtebilir veya yöntem çağrısına AssertApplicationRequirements güven kararını erteleyebilir. Bu kod uygulamaya önceden güvenir.
Not
Önceden güvenerek atanan izinler, özel yükleyici kodunun izinlerini aşamaz.
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 applicaiton 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 }
Kodunuzdan yüklemeyi denemeniz için yöntemini çağırın
InstallApplication
. Örneğin, sınıfınızıMyInstaller
adlandırdıysanız aşağıdaki şekilde çağırabilirsinizInstallApplication
.
Sonraki adımlar
ClickOnce uygulaması, güncelleştirme işlemi sırasında gösterilecek özel bir kullanıcı arabirimi de dahil olmak üzere özel güncelleştirme mantığı da ekleyebilir. Daha fazla bilgi için bkz. UpdateCheckInfo. ClickOnce uygulaması bir öğe kullanarak <customUX>
standart Başlat menüsü girişini, kısayolunu ve Program Ekle veya Kaldır girdisini de gizler. Daha fazla bilgi için bkz <. entryPoint> öğesi ve ShortcutAppId.