Udostępnij za pośrednictwem


Instruktaż: Pobieranie zestawów na żądanie z wdrażania ClickOnce API za pomocą projektanta

Domyślnie wszystkie zespoły zawarte w ClickOnce aplikacji są pobierane, gdy aplikacja najpierw jest uruchomiona.Jednak może być części aplikacji, które są używane przez niewielki zestaw użytkowników.W tym przypadku chcesz pobrać zestawu tylko wtedy, gdy tworzysz jeden z jego typów.Następujące instruktażu przedstawiono sposób oznaczania niektórych zespołów w aplikacji jako "optional" i jak je pobrać przy użyciu klas w System.Deployment.Application obszaru nazw podczas domaga się je plików wykonywalnych języka wspólnego.

[!UWAGA]

Aplikacja będzie uruchamiane w pełne zaufanie, aby użyć tej procedury.

[!UWAGA]

Okien dialogowych i poleceń menu, którą widzisz mogą różnić się od tych opisanych w pomocy, w zależności od tego, aktywne ustawienia lub edition.Aby zmienić ustawienia, kliknij przycisk Importuj i Eksportuj ustawienia na Narzędzia menu.Aby uzyskać więcej informacji, zobacz Visual Studio, ustawienia.

Tworzenie projektów

Aby utworzyć projekt, który używa zestawu na żądanie z programu Visual Studio

  1. Utwórz nowy projekt Windows Forms w Visual Studio.Na pliku menu, wskaż Dodaj, a następnie kliknij przycisk Nowy projekt.Wybierz Biblioteka klas projekt w oknie dialogowym i nadaj mu nazwę ClickOnceLibrary.

    [!UWAGA]

    W języku Visual Basic, firma Microsoft zaleca, należy zmodyfikować właściwości projektu, aby zmienić głównego obszaru nazw dla tego projektu, aby Microsoft.Samples.ClickOnceOnDemand lub do obszaru nazw wybór.Dla uproszczenia dwa projekty, w tym instruktażu są w tej samej przestrzeni nazw.

  2. Zdefiniowanie klasy o nazwie DynamicClass z jedną właściwość o nazwie Message.

    Public Class DynamicClass
        Sub New()
    
        End Sub
    
        Public ReadOnly Property Message() As String
            Get
                Message = "Hello, world!"
            End Get
        End Property
    End Class
    
    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. Wybierz projekt Windows Forms w Solution Explorer.Dodaj odwołanie do System.Deployment.Application Zgromadzenia i projektu odniesienia do ClickOnceLibrary projektu.

    [!UWAGA]

    W języku Visual Basic, firma Microsoft zaleca, należy zmodyfikować właściwości projektu, aby zmienić głównego obszaru nazw dla tego projektu, aby Microsoft.Samples.ClickOnceOnDemand lub do obszaru nazw wybór.Dla uproszczenia dwa projekty, w tym instruktażu znajdują się w tej samej przestrzeni nazw.

  4. Kliknij prawym przyciskiem myszy formularz, kliknij przycisk Widok Kod z menu i dodać następujące odwołanie do formularza.

    Imports System.Reflection
    Imports System.Deployment.Application
    Imports System.Collections.Generic
    Imports Microsoft.Samples.ClickOnceOnDemand
    Imports System.Security.Permissions
    
    using System.Reflection;
    using System.Deployment.Application;
    using Microsoft.Samples.ClickOnceOnDemand;
    using System.Security.Permissions;
    
  5. Dodaj następujący kod do pobierania tego zestawu, na żądanie.Ten kod pokazuje, jak do mapowania nazwy grupy przy użyciu rodzajowego zestaw zestawy Dictionary klasy.Ponieważ pobierane są tylko jednego zestawu w tym instruktażu, istnieje tylko jeden zestaw w naszej grupy.W rzeczywistej aplikacji będzie prawdopodobnie chcesz pobrać wszystkie zespoły związane z pojedynczej funkcji w aplikacji, w tym samym czasie.Tabela mapowania umożliwia to łatwo zrobić przez skojarzenie wszystkich plików dll, które należą do funkcji o nazwie grupy pobierania.

    ' 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 DllMappingTable As New Dictionary(Of String, String)()
    
    <SecurityPermission(SecurityAction.Demand, ControlAppDomain:=True)> _
    Sub New()
        ' This call is required by the Windows Form Designer.
        InitializeComponent()
    
        ' Add any initialization after the InitializeComponent() call.
        DllMappingTable("ClickOnceLibrary") = "ClickOnceLibrary"
    End Sub
    
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf Me.CurrentDomain_AssemblyResolve
    End Sub
    
    Private Function CurrentDomain_AssemblyResolve(ByVal sender As Object, ByVal args As ResolveEventArgs) As System.Reflection.Assembly
        Dim NewAssembly As Assembly = Nothing
    
        If (ApplicationDeployment.IsNetworkDeployed) Then
            Dim Deploy As ApplicationDeployment = ApplicationDeployment.CurrentDeployment
    
            ' Get the DLL name from the argument.
            Dim NameParts As String() = args.Name.Split(",")
            Dim DllName As String = NameParts(0)
            Dim DownloadGroupName As String = DllMappingTable(DllName)
    
            Try
                Deploy.DownloadFileGroup(DownloadGroupName)
            Catch ex As Exception
                MessageBox.Show("Could not download file group from Web server. Contact administrator. Group name: " & DownloadGroupName & "; DLL name: " & args.Name)
                Throw (ex)
            End Try
    
            ' 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 ex As Exception
                Throw (ex)
            End Try
        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.")
        End If
    
        Return NewAssembly
    End Function
    
    // 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. Na widoku menu, kliknij przycisk Przybornik.Przeciągnij Button z Przybornik na formularz.Kliknij dwukrotnie przycisk, a następnie dodaj następujący kod do Click programu obsługi zdarzeń.

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim DC As New DynamicClass()
        MessageBox.Show("Message is " & DC.Message)
    End Sub
    
    private void getAssemblyButton_Click(object sender, EventArgs e)
    {
        DynamicClass dc = new DynamicClass();
        MessageBox.Show("Message: " + dc.Message);
    }
    

Oznaczanie zestawów jako opcjonalne

Aby oznaczyć zestawów jako opcjonalne ClickOnce aplikacji przy użyciu programu Visual Studio

  1. Kliknij prawym przyciskiem myszy projekt Windows Forms w Solution Explorer i kliknij przycisk Właściwości.Wybierz Publikuj kartę.

  2. Kliknij przycisk Pliki aplikacji przycisku.

  3. Znajdź aukcję dla ClickOnceLibrary.dll.Ustaw Status publikowania pola rozwijanego do Dołącz.

  4. Rozwiń węzeł grupy pola rozwijanego i wybierz Nowy.Wprowadź nazwę ClickOnceLibrary jako nazwę nowej grupy.

  5. Kontynuować publikowanie aplikacji, jak opisano w Jak: publikowanie aplikacji ClickOnce, za pomocą Kreatora publikowania.

Aby oznaczyć zestawów jako opcjonalne w aplikacji ClickOnce przy użyciu Manifest generacji i narzędzia do edycji — graficzny klienta (MageUI.exe)

  1. Tworzenie sieci ClickOnce manifesty zgodnie z opisem w Instruktaż: Ręcznie wdrażanie aplikacji ClickOnce.

  2. Przed zamknięciem MageUI.exe, wybierz kartę która zawiera danego wdrożenia manifest aplikacji, a następnie na karcie Wybierz pliki kartę.

  3. Znajdź ClickOnceLibrary.dll na liście plików aplikacji i ustawić jego Typ pliku kolumny do Brak.Dla grupy kolumny, typ ClickOnceLibrary.dll.

Testowanie nowego zestawu

Aby przetestować na zgromadzenie na żądanie

  1. Uruchomić aplikacji rozmieszczone wraz z ClickOnce.

  2. Gdy pojawi się główne formularza, naciśnij klawisz Button.Powinieneś zobaczyć ciąg w okno komunikatu, który czyta "Hello, World!"

Zobacz też

Informacje

ApplicationDeployment