Podrobné pokyny: Stahování sestavení na požádání s rozhraním API nasazení ClickOnce s použitím designeru
Dle výchozího nastavení jsou všechna sestavení, která jsou součástí aplikace ClickOnce, stažena při prvním spuštění aplikace. Mohou však existovat části aplikace, které jsou používány malou skupinou uživatelů. V tomto případě chcete stáhnout sestavení pouze tehdy, když vytváříte jeden z jeho typů. Následující návod ukazuje, jak označit určité sestavení v aplikaci jako "volitelné" a jak je stáhnout pomocí tříd v oboru názvů System.Deployment.Application, když je modul CLR (Common Language Runtime) požaduje.
Poznámka
Aplikace bude muset být spuštěna v úplném vztahu důvěryhodnosti k použití této procedury.
Poznámka
Dialogová okna a příkazy nabídek, které vidíte, se mohou lišit od těch popsaných v nápovědě, v závislosti na aktivních nastaveních nebo edici. Chcete-li změnit nastavení, zvolte Import a Export Nastavení v nabídce Nástroje. Další informace naleznete v tématu Pracuje s nastavení.
Vytváření projektů
Chcete-li vytvořit projekt, který používá sestavení na vyžádání pomocí Visual Studia
Vytvořte nový projekt modelu Windows Forms v Visual Studio. V menu Soubor přejděte na Přidat a klepněte na příkaz Nový projekt. Zvolte projekt Knihovna tříd v dialogovém okně a pojmenujte jej ClickOnceLibrary.
Poznámka
V jazyce Visual Basic doporučujeme upravit vlastnosti projektu ke změně kořenového oboru názvů pro tento projekt Microsoft.Samples.ClickOnceOnDemand nebo k oboru názvů podle vašeho výběru. Pro zjednodušení jsou dva projekty v tomto návodu ve stejném obor názvů.
Definujte třídu s názvem DynamicClass s jedinou vlastností s názvem 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!"); } } } }
Zvolte projekt Windows Forms v Průzkumníku řešení. Přidejte odkaz do sestavení System.Deployment.Application a odkaz projektu do projektu ClickOnceLibrary.
Poznámka
V jazyce Visual Basic doporučujeme upravit vlastnosti projektu ke změně kořenového oboru názvů pro tento projekt Microsoft.Samples.ClickOnceOnDemand nebo k oboru názvů podle vašeho výběru. Pro zjednodušení jsou dva projekty v tomto návodu umístěny ve stejném oboru názvů.
Klikněte pravým tlačítkem myši na formulář, klikněte na Zobrazení kódu z nabídky a přidejte následující odkazy do formuláře.
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;
Přidejte následující kód pro stážení toto sestavení na požádání. Tento kód ukazuje, jak mapovat sadu sestavení do názvu skupiny pomocí obecné třídy Dictionary. Protože v tomto návodu stahujete pouze jediné sestavení, je v naší skupině pouze jedno sestavení. V reálné aplikaci byste pravděpodobně chtěli stáhnout všechna sestavení spojené s jedinou funkcí v aplikaci současně. Mapovací tabulka umožňuje toto provést snadno pomocí přidružení všech knihoven DLL, které patří do funkce s názvem skupiny stažení.
' 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); }
V nabídce Zobrazit klepněte na příkaz Sada nástrojů. Přetáhněte Button z Panelu nástrojů do formuláře. Poklikejte na tlačítko a přidejte následující kód do obslužné rutiny Click:
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); }
Označování sestavení jako volitelné
Pro označení sestavení jako volitelné v aplikaci ClickOnce pomocí Visual Studia
Klikněte pravým tlačítkem myši na projekt v Průzkumníku řešení a potom klikněte na Vlastnosti. Zvolte kartu Publikovat.
Klikněte na tlačítko Soubory aplikace.
Vyhledejte výpis pro ClickOnceLibrary.dll. Nastavte rozevírací seznam Stav publikování na Zahrnout.
Rozbalte rozevírací seznam Skupina a zvolte Nová. Zadejte název ClickOnceLibrary jako název nové skupiny.
Pokračujte v publikování aplikace, jak je popsáno v Postupy: Publikování aplikace ClickOnce pomocí Průvodce publikováním.
Pro označení sestavení jako volitelné v aplikaci ClickOnce pomocí editačního nástroje a generování manifestu – Grafický klient (MageUI.exe)
Vytvořte Vaše manifesty ClickOnce, jak je popsáno v Podrobné pokyny: Ruční nasazení aplikace ClickOnce.
Před zavřením MageUI.exe zvolte kartu, která obsahuje manifest aplikace Vašeho nasazení a v rámci této karty zvolte kartu Soubory.
Vyhledejte ClickOnceLibrary.dll v seznamu souborů aplikace a nastavte jeho sloupec Typ Souboru na Žádný. Pro sloupec Skupina zapište ClickOnceLibrary.dll.
Testování nového sestavení
Pro testování Vašeho sestavení na vyžádání
Spusťte aplikaci nasazenou s ClickOnce.
Po zobrazení hlavního formuláře, stiskněte Button. Měli byste vidět řetězec v okně zprávy s nápisem "Hello, World!"