Exemplarische Vorgehensweise: Bedarfsgerechtes Herunterladen von Assemblys mit der API für die ClickOnce-Bereitstellung unter Verwendung des Designers

Standardmäßig werden alle Assemblys, die in einer ClickOnce-Anwendung enthalten sind, beim ersten Ausführen der Anwendung heruntergeladen. Allerdings gibt es möglicherweise Teile der Anwendung, die von einer begrenzten Anzahl von Benutzern verwendet werden. In diesem Fall soll eine Assembly erst heruntergeladen werden, wenn eine der in ihr definierten Typen erstellt wird. Die folgende exemplarische Vorgehensweise bietet Hinweise zum Markieren bestimmter Assemblys in der Anwendung als „optional“ sowie zum Herunterladen dieser Assemblys, indem Sie Klassen im System.Deployment.Application -Namespace verwenden, wenn diese von der Common Language Runtime angefordert werden.

Hinweis

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

Hinweis

Die Anwendung muss mit voller Vertrauenswürdigkeit ausgeführt werden, um dieses Verfahren zu verwenden.

Hinweis

Je nach den aktiven Einstellungen oder der Version unterscheiden sich die Dialogfelder und Menübefehle auf Ihrem Bildschirm möglicherweise von den in der Hilfe beschriebenen. Klicken Sie im Menü Extras auf Einstellungen importieren und exportieren , um die Einstellungen zu ändern. Weitere Informationen finden Sie unter Reset settings (Zurücksetzen der Einstellungen).

Erstellen der Projekte

So erstellen Sie ein Projekt, das eine bedarfsabhängige Assembly mit Visual Studio verwendet

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

    Hinweis

    In Visual Basic empfiehlt es sich, dass Sie die Projekteigenschaften bearbeiten, um den Stammnamespace für dieses Projekt zu Microsoft.Samples.ClickOnceOnDemand oder dem Namespace Ihrer Wahl zu ändern. Der Einfachheit halber befinden sich die beiden Projekte in dieser exemplarischen Vorgehensweise im selben Namespace.

  2. Definieren Sie eine Klasse mit dem Namen DynamicClass mit einer einzelnen Eigenschaft mit dem Namen 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 das Windows Forms-Projekt im Projektmappen-Exploreraus. Fügen Sie einen Verweis zu einer System.Deployment.Application -Assembly und einen Projektverweis zum ClickOnceLibrary -Projekt hinzu.

    Hinweis

    In Visual Basic empfiehlt es sich, dass Sie die Projekteigenschaften bearbeiten, um den Stammnamespace für dieses Projekt zu Microsoft.Samples.ClickOnceOnDemand oder dem Namespace Ihrer Wahl zu ändern. Der Einfachheit halber befinden sich die beiden Projekte in dieser exemplarischen Vorgehensweise im selben Namespace.

  4. Klicken Sie mit der rechten Maustaste auf das Formular, klicken Sie anschließend auf Code anzeigen , und fügen Sie dem Formular den folgenden Verweis 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 dem Gruppennamen mithilfe einer generischen Dictionary -Klasse ein Satz von Assemblys zugeordnet wird. Da wir nur eine einzige Assembly in dieser exemplarischen Vorgehensweise herunterladen, ist nur eine Assembly in unserer Gruppe enthalten. In einer echten Anwendung würden Sie wahrscheinlich alle Assemblys herunterladen, die gleichzeitig mit einer einzelnen Funktion verknüpft sind. Mit der Zuordnungstabelle können Sie diesen Schritt leicht ausführen, indem Sie alle DLLs zuordnen, die zu einer Funktion mit einem Downloadgruppennamen gehören.

    // 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);
    }
    

Markieren von Assemblys als optional

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

  1. Klicken Sie im Windows Forms-Projekt in den Projektmappen-Explorer , und klicken Sie auf Eigenschaften. Wählen Sie die Registerkarte Veröffentlichen aus.

  2. Klicken Sie auf die Schaltfläche Anwendungsdateien .

  3. Suchen Sie das Listing für ClickOnceLibrary.dll. Legen Sie das Dropdownfeld Veröffentlichungsstatus auf Einschließenfest.

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

  5. Fahren Sie mit der Veröffentlichung Ihrer Anwendung fort, wie unter Vorgehensweise: Veröffentlichen einer ClickOnce-Anwendung mithilfe des Veröffentlichungs-Assistenten beschrieben.

So markieren Sie Assemblys in der ClickOnce-Anwendung mithilfe von Manifest Generation and Editing Tool— Graphical Client (MageUI.exe) als optional

  1. Erstellen Sie Ihre ClickOnce-Manifeste wie unter Exemplarische Vorgehensweise: Manuelles Bereitstellen einer ClickOnce-Anwendung beschrieben.

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

  3. Suchen Sie ClickOnceLibrary.dll in der Liste der Anwendungsdateien, und legen Sie die Spalte Dateityp auf Keinefest. Geben Sie für die Spalte GruppeClickOnceLibrary.dllein.

Testen der neuen Assembly

So testen Sie die bedarfsabhängige Assembly:

  1. Starten Sie Ihre Anwendung, die mit ClickOnce bereitgestellt wurde.

  2. Wenn das Hauptformular angezeigt wird, drücken Sie die Button. Daraufhin sollte eine Zeichenfolge in einem Meldungsfeldfenster angezeigt werden, die „Hello, World!“ lautet.