Freigeben über


Schritt-für-Schritt-Anleitung: Assemblys auf Anforderung mit der ClickOnce-Bereitstellungs-API herunterladen

Standardmäßig werden alle assemblys, die in einer ClickOnce-Anwendung enthalten sind, heruntergeladen, wenn die Anwendung zum ersten Mal ausgeführt wird. Möglicherweise verfügen Sie jedoch über Teile Ihrer Anwendung, die von einer kleinen Gruppe Ihrer Benutzer verwendet werden. In diesem Fall möchten Sie eine Assembly nur herunterladen, wenn Sie einen seiner Typen erstellen. In der folgenden exemplarischen Vorgehensweise wird veranschaulicht, wie bestimmte Assemblys in Ihrer Anwendung als "optional" gekennzeichnet werden und wie Sie diese mithilfe von Klassen im System.Deployment.Application Namespace herunterladen, wenn die Common Language Runtime (CLR) sie erfordert.

Hinweis

Die ApplicationDeployment Klasse und APIs im System.Deployment.Application Namespace werden in .NET Core und .NET 5 und höher nicht unterstützt. In .NET 7 wird eine neue Methode für den Zugriff auf Anwendungsbereitstellungseigenschaften unterstützt. Weitere Informationen finden Sie unter Access ClickOnce-Bereitstellungseigenschaften in .NET. .NET 7 unterstützt nicht das Äquivalent von ApplicationDeployment-Methoden.

Hinweis

Ihre Anwendung muss im vollen Vertrauen ausgeführt werden, um dieses Verfahren nutzen zu können.

Voraussetzungen

Sie benötigen eine der folgenden Komponenten, um diese Anleitung abzuschließen.

  • Das Windows SDK. Das Windows SDK kann aus dem Microsoft Download Center heruntergeladen werden.

  • Visual Studio.

Erstellen der Projekte

So erstellen Sie ein Projekt, das eine On-Demand-Assembly verwendet

  1. Erstellen Sie ein Verzeichnis mit dem Namen ClickOnceOnDemand.

  2. Öffnen Sie die Windows SDK-Eingabeaufforderung oder die Visual Studio-Eingabeaufforderung.

  3. Wechseln Sie zum ClickOnceOnDemand-Verzeichnis.

  4. Generieren Sie ein Öffentliches/Private-Schlüsselpaar mithilfe des folgenden Befehls:

    sn -k TestKey.snk
    
  5. Definieren Sie mithilfe von Notepad oder einem anderen Text-Editor eine Klasse DynamicClass mit einer einzelnen Eigenschaft namens Message.

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Microsoft.Samples.ClickOnceOnDemand
    {
        public class DynamicClass
        {
            public DynamicClass() {}
    
            public string Message
            {
                get
                {
                    return ("Hello, world!");
                }
            }
        }
    }
    
  6. Speichern Sie den Text je nach verwendeter Sprache als Datei mit dem Namen ClickOnceLibrary.cs oder ClickOnceLibrary.vb im ClickOnceOnDemand-Verzeichnis .

  7. Kompilieren Sie die Datei in einer Assembly.

    csc /target:library /keyfile:TestKey.snk ClickOnceLibrary.cs
    
  8. Verwenden Sie den folgenden Befehl, um das öffentliche Schlüsseltoken für die Assembly abzurufen:

    sn -T ClickOnceLibrary.dll
    
  9. Erstellen Sie eine neue Datei mit Ihrem Text-Editor, und geben Sie den folgenden Code ein. Dieser Code erstellt eine Windows Forms-Anwendung, die die ClickOnceLibrary-Assembly herunterlädt, wenn sie erforderlich ist.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Reflection;
    using System.Deployment.Application;
    using Microsoft.Samples.ClickOnceOnDemand;
    
    namespace ClickOnceOnDemand
    {
        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, Unrestricted=true)]
        public class Form1 : 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. 
            Dictionary<String, String> DllMapping = new Dictionary<String, String>();
    
            public static void Main()
            {
                Form1 NewForm = new Form1();
                Application.Run(NewForm);
            }
    
            public Form1()
            {
                // Configure form. 
                this.Size = new Size(500, 200);
                Button getAssemblyButton = new Button();
                getAssemblyButton.Size = new Size(130, getAssemblyButton.Size.Height);
                getAssemblyButton.Text = "Test Assembly";
                getAssemblyButton.Location = new Point(50, 50);
                this.Controls.Add(getAssemblyButton);
                getAssemblyButton.Click += new EventHandler(getAssemblyButton_Click);
    
                DllMapping["ClickOnceLibrary"] = "ClickOnceLibrary";
                AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
            }
    
            /*
             * Use ClickOnce APIs to download the assembly on demand.
             */
            private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
            {
                Assembly newAssembly = null;
    
                if (ApplicationDeployment.IsNetworkDeployed)
                {
                    ApplicationDeployment deploy = ApplicationDeployment.CurrentDeployment;
    
                    // Get the DLL name from the Name argument.
                    string[] nameParts = args.Name.Split(',');
                    string dllName = nameParts[0];
                    string downloadGroupName = DllMapping[dllName];
    
                    try
                    {
                        deploy.DownloadFileGroup(downloadGroupName);
                    }
                    catch (DeploymentException de)
                    {
                        MessageBox.Show("Downloading file group failed. Group name: " + downloadGroupName + "; DLL name: " + args.Name);
                        throw (de);
                    }
    
                    // Load the assembly.
                    // Assembly.Load() doesn't work here, as the previous failure to load the assembly
                    // is cached by the CLR. LoadFrom() is not recommended. Use LoadFile() instead.
                    try
                    {
                        newAssembly = Assembly.LoadFile(Application.StartupPath + @"\" + dllName + ".dll," +  
                "Version=1.0.0.0, Culture=en, PublicKeyToken=03689116d3a4ae33");
                    }
                    catch (Exception e)
                    {
                        throw (e);
                    }
                }
                else
                {
                    //Major error - not running under ClickOnce, but missing assembly. Don't know how to recover.
                    throw (new Exception("Cannot load assemblies dynamically - application is not deployed using ClickOnce."));
                }
    
    
                return (newAssembly);
            }
    
            private void getAssemblyButton_Click(object sender, EventArgs e)
            {
                DynamicClass dc = new DynamicClass();
                MessageBox.Show("Message: " + dc.Message);
            }
        }
    }
    
  10. Suchen Sie im Code den Aufruf von LoadFile.

  11. Setzen Sie PublicKeyToken auf den Wert, den Sie zuvor abgerufen haben.

  12. Speichern Sie die Datei entweder als Form1.cs oder als Form1.vb.

  13. Kompilieren Sie sie mithilfe des folgenden Befehls in eine ausführbare Datei.

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

Kennzeichnen von Assemblys als optional

Mithilfe von MageUI.exe markieren Sie Assemblys als optional in Ihrer ClickOnce-Anwendung.

  1. Erstellen Sie mithilfe vonMageUI.exeein Anwendungsmanifest, wie in exemplarischer Vorgehensweise beschrieben: Manuelles Bereitstellen einer ClickOnce-Anwendung. Verwenden Sie die folgenden Einstellungen für das Anwendungsmanifest:

    • Benennen Sie das Anwendungsmanifest ClickOnceOnDemand.

    • Legen Sie auf der Seite "Dateien " in der Zeile ClickOnceLibrary.dll die Spalte " Dateityp " auf "Keine" fest.

    • Geben Sie auf der Seite "Dateien" in der Zeile ClickOnceLibrary.dll im Gruppe-Spalte ClickOnceLibrary.dll ein.

  2. Erstellen Sie mithilfe vonMageUI.exeein Bereitstellungsmanifest, wie in exemplarischer Vorgehensweise beschrieben: Manuelles Bereitstellen einer ClickOnce-Anwendung. Verwenden Sie die folgenden Einstellungen für das Bereitstellungsmanifest:

    • Benennen Sie das Bereitstellungsmanifest ClickOnceOnDemand.

Testen der neuen Baugruppe

So testen Sie Ihre On-Demand-Assembly

  1. Laden Sie Ihre ClickOnce-Bereitstellung auf einen Webserver hoch.

  2. Starten Sie Ihre Anwendung, die mit ClickOnce aus einem Webbrowser bereitgestellt wird, indem Sie die URL in das Bereitstellungsmanifest eingeben. Wenn Sie Ihre ClickOnce-Anwendung ClickOnceOnDemandaufrufen und sie in das Stammverzeichnis von adatum.com hochladen, würde Ihre URL wie folgt aussehen:

    http://www.adatum.com/ClickOnceOnDemand/ClickOnceOnDemand.application
    
  3. Wenn das Hauptformular angezeigt wird, drücken Sie die Button. In einem Meldungsfeldfenster sollte eine Zeichenfolge mit dem Text "Hello, World!" angezeigt werden.