Freigeben über


Anleitung: Herunterladen von Assemblys bei Bedarf mit der ClickOnce-Bereitstellungs-API mithilfe des Designers

Standardmäßig werden alle assemblys, die in einer ClickOnce-Anwendung enthalten sind, heruntergeladen, wenn die Anwendung zum ersten Mal ausgeführt wird. Es kann jedoch Teile Ihrer Anwendung geben, die von einer kleinen Gruppe der 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 sie anfordert.

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.

Hinweis

Die angezeigten Dialogfelder und Menübefehle unterscheiden sich je nach aktiven Einstellungen oder Edition möglicherweise von den in der Hilfe beschriebenen Befehlen. Um Ihre Einstellungen zu ändern, klicken Sie im Menü "Extras" auf "Einstellungen importieren und exportieren". Weitere Informationen finden Sie unter "Einstellungen zurücksetzen".

Erstellen der Projekte

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

  1. Erstellen Sie ein neues Windows Forms-Projekt in Visual Studio. Zeigen Sie im Menü "Datei " auf "Hinzufügen", und klicken Sie dann auf "Neues Projekt". Wählen Sie im Dialogfeld ein Klassenbibliotheksprojekt aus, und nennen Sie es ClickOnceLibrary.

    Hinweis

    In Visual Basic wird empfohlen, die Projekteigenschaften so zu ändern, dass sie den Stammnamespace für dieses Projekt in Microsoft.Samples.ClickOnceOnDemand oder in einen Namespace Ihrer Wahl ändern. Der Einfachheit halber befinden sich die beiden Projekte in dieser Anleitung im selben Namespace.

  2. Definieren Sie eine Klasse namens 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!");
                }
            }
        }
    }
    
  3. Wählen Sie im Projektmappen-Explorer das Windows Forms-Projekt aus. Fügen Sie einen Verweis auf die System.Deployment.Application Assembly und einen Projektverweis auf das ClickOnceLibrary Projekt hinzu.

    Hinweis

    In Visual Basic wird empfohlen, die Projekteigenschaften so zu ändern, dass sie den Stammnamespace für dieses Projekt in Microsoft.Samples.ClickOnceOnDemand oder in einen Namespace Ihrer Wahl ändern. Der Einfachheit halber befinden sich die beiden Projekte in dieser Anleitung im selben Namespace.

  4. Klicken Sie mit der rechten Maustaste auf das Formular, klicken Sie im Menü auf "Code anzeigen ", und fügen Sie dem Formular die folgenden Verweise hinzu.

    using System.Reflection;
    using System.Deployment.Application;
    using Microsoft.Samples.ClickOnceOnDemand;
    using System.Security.Permissions;
    
  5. Fügen Sie den folgenden Code hinzu, um diese Assembly bei Bedarf herunterzuladen. Dieser Code zeigt, wie eine Gruppe von Assemblys einem Gruppennamen mithilfe einer generischen Dictionary Klasse zugeordnet wird. Da wir in dieser exemplarischen Vorgehensweise nur eine einzige Assembly herunterladen, gibt es nur eine Assembly in unserer Gruppe. In einer echten Anwendung würden Sie wahrscheinlich alle Assemblys herunterladen, die sich auf ein einzelnes Feature in Ihrer Anwendung gleichzeitig beziehen. Mithilfe der Zuordnungstabelle können Sie dies ganz einfach tun, indem Sie alle DLLs, die zu einem Feature gehören, einem Downloadgruppennamen zuordnen.

    // 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>();
    
    [SecurityPermission(SecurityAction.Demand, ControlAppDomain=true)]
    public Form1()
    {
        InitializeComponent();
    
        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");
            }
            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);
    }
    
  6. Klicken Sie im Menü "Ansicht" auf "Toolbox". Ziehen Sie eine Button aus der Toolbox auf das Formular. Doppelklicken Sie auf die Schaltfläche, und fügen Sie dem Click Ereignishandler den folgenden Code hinzu.

    private void getAssemblyButton_Click(object sender, EventArgs e)
    {
        DynamicClass dc = new DynamicClass();
        MessageBox.Show("Message: " + dc.Message);
    }
    

Kennzeichnen von Assemblys als optional

So markieren Sie Assemblys als optional in Ihrer ClickOnce-Anwendung mithilfe von Visual Studio

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Windows Forms-Projekt, und klicken Sie dann auf "Eigenschaften". Wählen Sie die Registerkarte "Veröffentlichen" aus .

  2. Klicken Sie auf die Schaltfläche "Anwendungsdateien ".

  3. Suchen Sie die Auflistung für ClickOnceLibrary.dll. Legen Sie das Dropdownfeld "Veröffentlichungsstatus " auf "Einschließen" fest.

  4. Erweitern Sie das Dropdownfeld "Gruppe ", und wählen Sie " Neu" aus. Geben Sie den Namen ClickOnceLibrary als neuen Gruppennamen ein.

  5. Setzen Sie die Veröffentlichung Ihrer Anwendung wie unter "How to: Publish a ClickOnce application using the Publish Wizard" beschrieben fort.

So markieren Sie Assemblys als optional in Ihrer ClickOnce-Anwendung mithilfe des Manifestgenerierungs- und Bearbeitungstools – grafischer Client (MageUI.exe)

  1. Erstellen Sie Ihre ClickOnce-Manifeste, wie in der Anleitung beschrieben: Manuelle Bereitstellung einer ClickOnce-Anwendung.

  2. Wählen Sie vor dem Schließen MageUI.exedie Registerkarte aus, die das Anwendungsmanifest Ihrer Bereitstellung enthält, und wählen Sie auf dieser Registerkarte die Registerkarte "Dateien " aus.

  3. Suchen Sie ClickOnceLibrary.dll in der Liste der Anwendungsdateien, und legen Sie die Spalte "Dateityp" auf "Keine" fest. Geben Sie für die Spalte ClickOnceLibrary.dll" ein.

Testen Sie die neue Assembly

So testen Sie Ihre On-Demand-Assembly:

  1. Starten Sie die mit ClickOnce bereitgestellte Anwendung.

  2. Wenn das Hauptformular angezeigt wird, drücken Sie die Button. Sie sollten eine Zeichenfolge in einem Meldungsfeldfenster sehen, in dem "Hello, World!" steht.