Bagikan melalui


Panduan: Mengunduh rakitan sesuai permintaan dengan API penyebaran ClickOnce menggunakan Perancang

Secara default, semua rakitan yang disertakan dalam aplikasi ClickOnce diunduh saat aplikasi pertama kali dijalankan. Namun, mungkin ada bagian dari aplikasi Anda yang digunakan oleh sekumpulan kecil pengguna. 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 namespace System.Deployment.Application ketika runtime bahasa umum 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.

Catatan

Kotak dialog dan perintah menu yang Anda lihat mungkin berbeda dari yang dijelaskan dalam Bantuan tergantung pada pengaturan atau edisi aktif Anda. Untuk mengubah pengaturan Anda, klik Impor dan Ekspor Pengaturan pada menu Alat. Untuk mengetahui informasi selengkapnya, lihat Mengatur ulang dan menjalankan ulang.

Membuat proyek

Untuk membuat proyek yang menggunakan rakitan sesuai permintaan dengan Visual Studio

  1. Buat proyek Formulir Windows di Visual Studio. Pada menu File, arahkan ke Tambahkan lalu klik Proyek Baru. Pilih proyek Pustaka Kelas dalam kotak dialog dan beri nama ClickOnceLibrary.

    Catatan

    Dalam Visual Basic, kami sarankan Anda memodifikasi properti proyek untuk mengubah namespace layanan akar untuk proyek ini ke Microsoft.Samples.ClickOnceOnDemand atau ke namespace pilihan Anda. Untuk kesederhanaan, kedua proyek dalam panduan ini berada di namespace yang sama.

  2. 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!");
                }
            }
        }
    }
    
  3. Pilih proyek Formulir Windows di Penjelajah Solusi. Tambahkan referensi ke perakitan System.Deployment.Application dan referensi proyek ke proyek ClickOnceLibrary.

    Catatan

    Dalam Visual Basic, kami sarankan Anda memodifikasi properti proyek untuk mengubah namespace layanan akar untuk proyek ini ke Microsoft.Samples.ClickOnceOnDemand atau ke namespace pilihan Anda. Untuk kesederhanaan, kedua proyek dalam panduan ini terletak di namespace yang sama.

  4. Klik kanan formulir, klik Tampilkan Kode dari menu, dan tambahkan referensi berikut ke formulir.

    using System.Reflection;
    using System.Deployment.Application;
    using Microsoft.Samples.ClickOnceOnDemand;
    using System.Security.Permissions;
    
  5. Tambahkan kode berikut untuk mengunduh rakitan ini sesuai permintaan. Kode ini menunjukkan cara memetakan sekumpulan rakitan ke nama grup menggunakan kelas Dictionary generik. Karena kami hanya mengunduh satu perakitan dalam panduan ini, hanya ada satu perakitan dalam grup kami. Dalam aplikasi nyata, Anda mungkin ingin mengunduh semua rakitan yang terkait dengan satu fitur dalam aplikasi Anda secara bersamaan. Tabel pemetaan memungkinkan Anda melakukan ini dengan mudah dengan mengaitkan semua DLL yang termasuk dalam fitur dengan nama grup unduhan.

    // 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. Pada menu Tampilan, klik Kotak Alat. Seret Button dari Toolbox ke formulir. Klik dua kali tombol dan tambahkan kode berikut ke penanganan aktivitas Click.

    private void getAssemblyButton_Click(object sender, EventArgs e)
    {
        DynamicClass dc = new DynamicClass();
        MessageBox.Show("Message: " + dc.Message);
    }
    

Menandai rakitan sebagai opsional

Untuk menandai rakitan sebagai opsional di aplikasi ClickOnce Anda dengan menggunakan Visual Studio

  1. Klik kanan proyek Formulir Windows di Penjelajah Solusi dan klik Properti. Pilih tab Terbitkan.

  2. Klik tombol File Aplikasi.

  3. Temukan daftar untuk ClickOnceLibrary.dll. Atur kotak drop-down Status Penerbitan ke Sertakan.

  4. Perluas kotak drop-down Grup dan pilih Baru. Masukkan nama ClickOnceLibrary sebagai nama grup.

  5. Lanjutkan menerbitkan aplikasi Anda seperti yang dijelaskan dalam Cara: Menerbitkan aplikasi ClickOnce menggunakan Wizard Terbitkan.

Untuk menandai rakitan sebagai opsional di aplikasi ClickOnce Anda dengan menggunakan Pembuatan manifes dan Alat Pengeditan — Klien Grafik (MageUI.exe)

  1. Buat manifes ClickOnce Anda seperti yang dijelaskan dalam Panduan: Menyebarkan aplikasi ClickOnce secara manual.

  2. Sebelum menutup MageUI.exe, pilih tab yang berisi manifes aplikasi penyebaran Anda, dan di dalam tab tersebut pilih tab File.

  3. Temukan ClickOnceLibrary.dll dalam daftar file aplikasi dan atur kolom Jenis File-nya ke Tidak Ada. Untuk kolom Grup, ketik ClickOnceLibrary.dll.

Menguji rakitan baru

Untuk menguji rakitan sesuai permintaan Anda:

  1. Mulai aplikasi Anda yang disebarkan dengan ClickOnce.

  2. Saat formulir utama Anda muncul, tekan Button. Anda akan melihat string di jendela kotak pesan yang berbunyi, "Halo, Dunia!"