Export (0) Print
Expand All
Expand Minimize

Walkthrough: Creating a Custom Installer for a ClickOnce Application

Any ClickOnce application based on an .exe file can be silently installed and updated by a custom installer. A custom installer can implement custom user experience during installation, including custom dialog boxes for security and maintenance operations. To perform installation operations, the custom installer uses the InPlaceHostingManager class. This walkthrough demonstrates how to create a custom installer that silently installs a ClickOnce application.

To create a custom ClickOnce application installer

  1. In your ClickOnce application, add references to System.Deployment and System.Windows.Forms.

  2. Add a new class to your application and specify any name. This walkthrough uses the name MyInstaller.

  3. Add the following Imports or using statements to the top of your new class.

    Imports System.Deployment.Application
    Imports System.Windows.Forms
    
  4. Add the following methods to your class.

    These methods call InPlaceHostingManager methods to download the deployment manifest, assert appropriate permissions, ask the user for permission to install, and then download and install the application into the ClickOnce cache. A custom installer can specify that a ClickOnce application is pre-trusted, or can defer the trust decision to the AssertApplicationRequirements method call. This code pre-trusts the application.

    Note Note

    Permissions assigned by pre-trusting cannot exceed the permissions of the custom installer code.

        Dim WithEvents iphm As InPlaceHostingManager = Nothing 
    
        Public Sub InstallApplication(ByVal deployManifestUriStr As String)
            Try 
                Dim deploymentUri As New Uri(deployManifestUriStr)
                iphm = New InPlaceHostingManager(deploymentUri, False)
                MessageBox.Show("Created the object.")
            Catch uriEx As UriFormatException
                MessageBox.Show("Cannot install the application: " & _
                                "The deployment manifest URL supplied is not a valid URL." & _
                                "Error: " & uriEx.Message)
                Return 
            Catch platformEx As PlatformNotSupportedException
                MessageBox.Show("Cannot install the application: " & _
                                "This program requires Windows XP or higher. " & _
                                "Error: " & platformEx.Message)
                Return 
            Catch argumentEx As ArgumentException
                MessageBox.Show("Cannot install the application: " & _
                                "The deployment manifest URL supplied is not a valid URL." & _
                                "Error: " & argumentEx.Message)
                Return 
            End Try
    
            iphm.GetManifestAsync()
        End Sub 
    
        Private Sub iphm_GetManifestCompleted(ByVal sender As Object, ByVal e As GetManifestCompletedEventArgs) Handles iphm.GetManifestCompleted
            ' Check for an error. 
            If (e.Error IsNot Nothing) Then 
                ' Cancel download and install.
                MessageBox.Show("Could not download manifest. Error: " & e.Error.Message)
                Return 
            End If 
    
            ' Dim isFullTrust As Boolean = 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 ex As Exception
                MessageBox.Show("An error occurred while verifying the application. " & _
                                "Error text: " & ex.Message)
                Return 
            End Try 
    
            ' Use the information from GetManifestCompleted() to confirm  
            ' that the user wants to proceed. 
            Dim appInfo As String = "Application Name: " & e.ProductName
            appInfo &= ControlChars.Lf & "Version: " & e.Version.ToString()
            appInfo &= ControlChars.Lf & "Support/Help Requests: " 
    
            If Not (e.SupportUri Is Nothing) Then
                appInfo &= e.SupportUri.ToString()
            Else
                appInfo &= "N/A" 
            End If
    
            appInfo &= ControlChars.Lf & ControlChars.Lf & _
                "Confirmed that this application can run with its requested permissions." 
    
            ' If isFullTrust Then 
            '    appInfo &= ControlChars.Lf & ControlChars.Lf & _ 
            '        "This application requires full trust in order to run." 
            ' End If
    
            appInfo &= ControlChars.Lf & ControlChars.Lf & "Proceed with installation?" 
    
            Dim dr As DialogResult = MessageBox.Show(appInfo, _
                "Confirm Application Install", MessageBoxButtons.OKCancel, MessageBoxIcon.Question)
            If dr <> System.Windows.Forms.DialogResult.OK Then 
                Return 
            End If 
    
            ' Download the deployment manifest.  
            ' Usually, this shouldn't throw an exception unless  
            ' AssertApplicationRequirements() failed, or you did not call that method 
            ' before calling this one. 
            Try
                iphm.DownloadApplicationAsync()
            Catch downloadEx As Exception
                MessageBox.Show("Cannot initiate download of application. Error: " & downloadEx.Message)
                Return 
            End Try 
        End Sub
    
    #If 0 Then 
        Private Function CheckForFullTrust(ByVal appManifest As XmlReader) As Boolean 
            Dim isFullTrust As Boolean = False 
    
            If (appManifest Is Nothing) Then 
                Throw New ArgumentNullException("appManifest cannot be null.")
            End If 
    
            Dim xaUnrestricted As 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 Then 
                If xaUnrestricted.Value = "true" Then 
                    Return True 
                End If 
            End If 
    
            Return False 
        End Function
    #End If 
    
        Private Sub iphm_DownloadProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs) Handles iphm.DownloadProgressChanged
            ' you can show percentage of task completed using e.ProgressPercentage 
        End Sub 
    
        Private Sub iphm_DownloadApplicationCompleted(ByVal sender As Object, ByVal e As DownloadApplicationCompletedEventArgs) Handles iphm.DownloadApplicationCompleted
            ' Check for an error. 
            If (e.Error IsNot Nothing) Then 
                ' Cancel download and install.
                MessageBox.Show("Could not download and install application. Error: " & e.Error.Message)
                Return 
            End If 
    
            ' Inform the user that their application is ready for use. 
            MessageBox.Show("Application installed! You may now run it from the Start menu.")
        End Sub
    
  5. To attempt installation from your code, call the InstallApplication method. For example, if you named your class MyInstaller, you might call InstallApplication in the following way.

    Dim installer As New MyInstaller()
    installer.InstallApplication("\\myServer\myShare\myApp.application")
    MessageBox.Show("Installer object created.")
    

A ClickOnce application can also add custom update logic, including a custom user interface to show during the update process. For more information, see UpdateCheckInfo. A ClickOnce application can also suppress the standard Start menu entry, shortcut, and Add or Remove Programs entry by using a <customUX> element. For more information, see <entryPoint> Element (ClickOnce Application) and ShortcutAppId.

Show:
© 2014 Microsoft