Návod: Stažení sestavení na vyžádání pomocí rozhraní API nasazení ClickOnce
Ve výchozím nastavení se všechna sestavení zahrnutá v aplikaci ClickOnce stáhnou při prvním spuštění aplikace. Můžete ale mít části aplikace, které používají malá sada uživatelů. V tomto případě chcete stáhnout sestavení pouze v případě, že vytvoříte jeden z jeho typů. Následující názorný postup ukazuje, jak označit určitá sestavení v aplikaci jako volitelná a jak je stáhnout pomocí tříd v System.Deployment.Application oboru názvů, když je modul CLR (Common Language Runtime) požaduje.
Poznámka:
Třída ApplicationDeployment a rozhraní API v System.Deployment.Application oboru názvů nejsou podporovány v .NET Core a .NET 5 a novějších verzích. V .NET 7 se podporuje nová metoda přístupu k vlastnostem nasazení aplikace. Další informace naleznete v tématu Access ClickOnce vlastnosti nasazení v .NET. .NET 7 nepodporuje ekvivalent metod ApplicationDeployment.
Poznámka:
Aby bylo možné tento postup použít, musí vaše aplikace běžet v plném vztahu důvěryhodnosti.
Požadavky
K dokončení tohoto návodu budete potřebovat jednu z následujících komponent:
Sada Windows SDK. Sadu Windows SDK si můžete stáhnout z webu Microsoft Download Center.
Visual Studio.
Vytvoření projektů
Vytvoření projektu, který používá sestavení na vyžádání
Vytvořte adresář s názvem ClickOnceOnDemand.
Otevřete příkazový řádek sady Windows SDK nebo příkazový řádek sady Visual Studio.
Přejděte do adresáře ClickOnceOnDemand.
Pomocí následujícího příkazu vygenerujte pár veřejného a privátního klíče:
sn -k TestKey.snk
Pomocí Poznámkového bloku nebo jiného textového editoru definujte třídu s názvem
DynamicClass
jedna vlastnostMessage
.Text uložte jako soubor s názvem ClickOnceLibrary.cs nebo ClickOnceLibrary.vb v závislosti na používaném jazyce do adresáře ClickOnceOnDemand.
Zkompilujte soubor do sestavení.
Token veřejného klíče pro sestavení získáte pomocí následujícího příkazu:
sn -T ClickOnceLibrary.dll
Pomocí textového editoru vytvořte nový soubor a zadejte následující kód. Tento kód vytvoří model Windows Forms aplikaci, která stáhne sestavení ClickOnceLibrary v případě potřeby.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Reflection; using System.Deployment.Application; using Microsoft.Samples.ClickOnceOnDemand; namespace ClickOnceOnDemand { [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, Unrestricted=true)] public class Form1 : Form { // 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>(); public static void Main() { Form1 NewForm = new Form1(); Application.Run(NewForm); } public Form1() { // Configure form. this.Size = new Size(500, 200); Button getAssemblyButton = new Button(); getAssemblyButton.Size = new Size(130, getAssemblyButton.Size.Height); getAssemblyButton.Text = "Test Assembly"; getAssemblyButton.Location = new Point(50, 50); this.Controls.Add(getAssemblyButton); getAssemblyButton.Click += new EventHandler(getAssemblyButton_Click); 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," + "Version=1.0.0.0, Culture=en, PublicKeyToken=03689116d3a4ae33"); } 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); } private void getAssemblyButton_Click(object sender, EventArgs e) { DynamicClass dc = new DynamicClass(); MessageBox.Show("Message: " + dc.Message); } } }
V kódu vyhledejte volání LoadFile.
Nastavte
PublicKeyToken
hodnotu, kterou jste získali dříve.Uložte soubor jako Form1.cs nebo Form1.vb.
Zkompilujte ho do spustitelného souboru pomocí následujícího příkazu.
Označení sestavení jako nepovinných
Označení sestavení jako nepovinných v aplikaci ClickOnce pomocí MageUI.exe
Pomocí MageUI.exe vytvořte manifest aplikace, jak je popsáno v návodu: Ruční nasazení aplikace ClickOnce. Pro manifest aplikace použijte následující nastavení:
Pojmenujte manifest
ClickOnceOnDemand
aplikace .Na stránce Soubory nastavte v řádku ClickOnceLibrary.dll sloupec Typ souboru na Hodnotu Žádné.
Na stránce Soubory zadejte do řádku
ClickOnceLibrary.dll
ClickOnceLibrary.dll sloupec Skupina.
Pomocí MageUI.exe vytvořte manifest nasazení, jak je popsáno v návodu: Ruční nasazení aplikace ClickOnce. Pro manifest nasazení použijte následující nastavení:
- Pojmenujte manifest
ClickOnceOnDemand
nasazení .
- Pojmenujte manifest
Testování nového sestavení
Testování sestavení na vyžádání
Nahrajte nasazení ClickOnce na webový server.
Spusťte aplikaci nasazenou pomocí ClickOnce z webového prohlížeče zadáním adresy URL do manifestu nasazení. Pokud zavoláte aplikaci
ClickOnceOnDemand
ClickOnce a nahrajete ji do kořenového adresáře adatum.com, adresa URL bude vypadat takto:http://www.adatum.com/ClickOnceOnDemand/ClickOnceOnDemand.application
Jakmile se zobrazí hlavní formulář, stiskněte klávesu Button. V okně okna se zprávou by se měl zobrazit řetězec, který přečte text "Hello, World!".