This documentation is archived and is not being maintained.

Walkthrough: Downloading Assemblies on Demand with the ClickOnce Deployment API

By default, all of the assemblies included in a ClickOnce application are downloaded when the application is first run. However, you may have parts of your application that are used by a small set of your users. In this case, you want to download an assembly only when you create one of its types. The following walkthrough demonstrates how to mark certain assemblies in your application as "optional", and how to download them by using classes in the System.Deployment.Application namespace when the common language runtime (CLR) demands them.


Your application will have to run in full trust to use this procedure.

You will need one of the following components to complete this walkthrough:

  • The .NET Framework 2.0 SDK. The .NET Framework 2.0 SDK is available as a component of the Visual Studio 2005 setup or can be downloaded from the Microsoft Download Center.

  • The Windows SDK for Windows Vista. The Windows SDK for Windows Vista can be downloaded from the Microsoft Download Center.

  • Microsoft Visual Studio 2005 or later version.

To create a project that uses an on-demand assembly

  1. Create a directory named ClickOnceOnDemand.

  2. Open the .NET Framework SDK Command Prompt or the Visual Studio Command Prompt.

  3. Change to the ClickOnceOnDemand directory.

  4. Generate a public/private key pair using the following command:

    sn -k TestKey.snk
  5. Using Notepad or another text editor, define a class named DynamicClass with a single property named Message.

    Public Class DynamicClass
        Sub New()
        End Sub 
        Public ReadOnly Property Message() As String 
                Message = "Hello, world!" 
            End Get 
        End Property 
    End Class
  6. Save the text as a file named ClickOnceLibrary.cs or ClickOnceLibrary.vb, depending on the language you use, to the ClickOnceOnDemand directory.

  7. Compile the file into an assembly.

    csc /target:library /keyfile:TestKey.snk ClickOnceLibrary.cs

    vbc /target:library /keyfile:TestKey.snk ClickOnceLibrary.vb
  8. To get the public key token for the assembly, use the following command:

    sn -T ClickOnceLibrary.dll
  9. Create a new file using your text editor and enter the following code. This code creates a Windows Forms application that downloads the ClickOnceLibrary assembly when it is required.

    Imports System
    Imports System.Windows.Forms
    Imports System.Deployment.Application
    Imports System.Drawing
    Imports System.Reflection
    Imports System.Collections.Generic
    Imports Microsoft.Samples.ClickOnceOnDemand
    Namespace Microsoft.Samples.ClickOnceOnDemand
       <System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, Unrestricted:=true)> _
       Class Form1
          Inherits Form
            ' Maintain a dictionary mapping DLL names to download file groups. This is trivial for this sample, 
            ' but will be important in real-world applications where a feature is spread across multiple DLLs, 
            ' and you want to download all DLLs for that feature in one shot.  
            Dim DllMapping as Dictionary(Of String, String) = new Dictionary(of String, String)()
          Public Sub New()
             ' Add button to form. 
                Dim GetAssemblyButton As New Button()
                GetAssemblyButton.Location = New Point(100, 100)
                GetAssemblyButton.Text = "Get assembly on demand" 
                AddHandler GetAssemblyButton.Click, AddressOf GetAssemblyButton_Click
                DllMapping("ClickOnceLibrary") = "ClickOnceLibrary" 
                AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf CurrentDomain_AssemblyResolve
          End Sub
            <STAThread()> _
            Shared Sub Main()
                Application.Run(New Form1())
            End Sub 
            Private Function CurrentDomain_AssemblyResolve(ByVal sender As Object, ByVal args As ResolveEventArgs) As Assembly
                If ApplicationDeployment.IsNetworkDeployed Then 
                    Dim deploy As ApplicationDeployment = ApplicationDeployment.CurrentDeployment
                    ' Get the DLL name from the Name argument. 
                    Dim nameParts() as String = args.Name.Split(",")
                    Dim dllName as String = nameParts(0)
    		Dim downloadGroupName as String = DllMapping(dllName)
                    Catch de As DeploymentException
                    End Try 
                    ' Load the assembly. 
                    Dim newAssembly As Assembly = Nothing 
                        newAssembly = Assembly.LoadFile(Application.StartupPath & "\\" & dllName & ".dll," & _  
    			"Version=, Culture=en, PublicKeyToken=03689116d3a4ae33")
                    Catch ex As Exception
                        MessageBox.Show("Could not download assembly on demand.")
                    End Try
                    CurrentDomain_AssemblyResolve = newAssembly
                    CurrentDomain_AssemblyResolve = Nothing 
                End If 
            End Function 
            Private Sub GetAssemblyButton_Click(ByVal sender As Object, ByVal e As EventArgs)
                Dim ourClass As New DynamicClass()
                MessageBox.Show("DynamicClass string is: " + ourClass.Message)
            End Sub 
        End Class 
    End Namespace
  10. In the code, locate the call to LoadFile.

  11. Set PublicKeyToken to the value that you retrieved earlier.

  12. Save the file as either Form1.cs or Form1.vb.

  13. Compile it into an executable using the following command.

    csc /target:exe /reference:ClickOnceLibrary.dll Form1.cs

    vbc /target:exe /reference:ClickOnceLibrary.dll Form1.vb

To mark assemblies as optional in your ClickOnce application by using MageUI.exe

  1. Using MageUI.exe, create an application manifest as described in Walkthrough: Manually Deploying a ClickOnce Application. Use the following settings for the application manifest:

    • Name the application manifest ClickOnceOnDemand.

    • On the Files page, in the ClickOnceLibrary.dll row, set the File Type column to None.

    • On the Files page, in the ClickOnceLibrary.dll row, type ClickOnceLibrary.dll in the Group column.

  2. Using MageUI.exe, create a deployment manifest as described in Walkthrough: Manually Deploying a ClickOnce Application. Use the following settings for the deployment manifest:

    • Name the deployment manifest ClickOnceOnDemand.

To test your on-demand assembly

  1. Upload your ClickOnce deployment to a Web server.

  2. Start your application deployed with ClickOnce from a Web browser by entering the URL to the deployment manifest. If you call your ClickOnce application ClickOnceOnDemand, and you upload it to the root directory of, your URL would look like this:
  3. When your main form appears, press the Button. You should see a string in a message box window that reads "Hello, World!".