Bagikan melalui


Panduan: Mengunduh rakitan sesuai permintaan dengan API penyebaran ClickOnce

Secara default, semua rakitan yang disertakan dalam aplikasi ClickOnce diunduh saat aplikasi pertama kali dijalankan. Namun, Anda mungkin memiliki bagian dari aplikasi yang digunakan oleh sekumpulan kecil pengguna Anda. Dalam hal ini, Anda ingin mengunduh assembly hanya ketika Anda membuat salah satu jenisnya. Panduan berikut menunjukkan cara menandai rakitan tertentu di aplikasi Anda sebagai "opsional", dan cara mengunduhnya dengan menggunakan kelas di System.Deployment.Application namespace ketika runtime bahasa umum (CLR) menuntutnya.

Catatan

Kelas ApplicationDeployment dan API di System.Deployment.Application namespace tidak didukung dalam .NET Core dan .NET 5 dan versi yang lebih baru. Di .NET 7, metode baru untuk mengakses properti penyebaran aplikasi didukung. Untuk informasi selengkapnya, lihat Properti penyebaran Access ClickOnce di .NET. .NET 7 tidak mendukung metode ApplicationDeployment yang setara.

Catatan

Aplikasi Anda harus berjalan dengan kepercayaan penuh untuk menggunakan prosedur ini.

Prasyarat

Anda akan memerlukan salah satu komponen berikut untuk menyelesaikan panduan ini:

  • The Windows SDK. Windows SDK dapat diunduh dari Pusat Unduhan Microsoft.

  • Visual Studio.

Membuat proyek

Untuk membuat proyek yang menggunakan rakitan sesuai permintaan

  1. Buat direktori bernama ClickOnceOnDemand.

  2. Buka Prompt Perintah Windows SDK atau Prompt Perintah Visual Studio.

  3. Ubah ke direktori ClickOnceOnDemand.

  4. Buat pasangan kunci publik/privat menggunakan perintah berikut:

    sn -k TestKey.snk
    
  5. Menggunakan Notepad atau editor teks lain, tentukan kelas bernama DynamicClass dengan satu properti bernama 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!");
                }
            }
        }
    }
    
  6. Simpan teks sebagai file bernama ClickOnceLibrary.cs atau ClickOnceLibrary.vb, tergantung pada bahasa yang Anda gunakan, ke direktori ClickOnceOnDemand.

  7. Kompilasi file ke dalam rakitan.

    csc /target:library /keyfile:TestKey.snk ClickOnceLibrary.cs
    
  8. Untuk mendapatkan token kunci publik untuk rakitan, gunakan perintah berikut:

    sn -T ClickOnceLibrary.dll
    
  9. Buat file baru menggunakan editor teks Anda dan masukkan kode berikut. Kode ini membuat aplikasi Formulir Windows yang mengunduh perakitan ClickOnceLibrary saat diperlukan.

    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);
            }
        }
    }
    
  10. Dalam kode, temukan panggilan ke LoadFile.

  11. AturPublicKeyToken ke nilai yang Anda ambil sebelumnya.

  12. Simpan file sebagai Form1.cs atau Form1.vb.

  13. Kompilasi ke dalam executable menggunakan perintah berikut.

    csc /target:exe /reference:ClickOnceLibrary.dll Form1.cs
    

Menandai rakitan sebagai opsional

Untuk menandai rakitan sebagai opsional di aplikasi ClickOnce Anda dengan menggunakan MageUI.exe

  1. Menggunakan MageUI.exe, buat manifes aplikasi seperti yang dijelaskan dalam Panduan: Menyebarkan aplikasi ClickOnce secara manual. Gunakan pengaturan berikut untuk manifes aplikasi:

    • Beri nama manifes ClickOnceOnDemandaplikasi .

    • Pada halaman File , di baris ClickOnceLibrary.dll , atur kolom Tipe File ke Tidak Ada.

    • Pada halaman File , di baris ClickOnceLibrary.dll , ketik ClickOnceLibrary.dll kolom Grup .

  2. Menggunakan MageUI.exe, buat manifes penyebaran seperti yang dijelaskan dalam Panduan: Menyebarkan aplikasi ClickOnce secara manual. Gunakan pengaturan berikut untuk manifes penyebaran:

    • Beri nama manifes ClickOnceOnDemandpenyebaran .

Menguji rakitan baru

Untuk menguji rakitan sesuai permintaan Anda

  1. Unggah penyebaran ClickOnce Anda ke server Web.

  2. Mulai aplikasi Anda yang disebarkan dengan ClickOnce dari browser Web dengan memasukkan URL ke manifes penyebaran. Jika Anda memanggil aplikasi ClickOnceOnDemandClickOnce , dan Mengunggahnya ke direktori akar adatum.com, URL Anda akan terlihat seperti ini:

    http://www.adatum.com/ClickOnceOnDemand/ClickOnceOnDemand.application
    
  3. Saat formulir utama Anda muncul, tekan Button. Anda akan melihat string di jendela kotak pesan yang berbunyi "Halo, Dunia!".