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
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.
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!"); } } } }
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.
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;
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); }
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
Kliknij prawym przyciskiem myszy projekt Windows Forms w Solution Explorer i kliknij przycisk Właściwości.Wybierz Publikuj kartę.
Kliknij przycisk Pliki aplikacji przycisku.
Znajdź aukcję dla ClickOnceLibrary.dll.Ustaw Status publikowania pola rozwijanego do Dołącz.
Rozwiń węzeł grupy pola rozwijanego i wybierz Nowy.Wprowadź nazwę ClickOnceLibrary jako nazwę nowej grupy.
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)
Tworzenie sieci ClickOnce manifesty zgodnie z opisem w Instruktaż: Ręcznie wdrażanie aplikacji ClickOnce.
Przed zamknięciem MageUI.exe, wybierz kartę która zawiera danego wdrożenia manifest aplikacji, a następnie na karcie Wybierz pliki kartę.
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
Uruchomić aplikacji rozmieszczone wraz z ClickOnce.
Gdy pojawi się główne formularza, naciśnij klawisz Button.Powinieneś zobaczyć ciąg w okno komunikatu, który czyta "Hello, World!"