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
Buat direktori bernama ClickOnceOnDemand.
Buka Prompt Perintah Windows SDK atau Prompt Perintah Visual Studio.
Ubah ke direktori ClickOnceOnDemand.
Buat pasangan kunci publik/privat menggunakan perintah berikut:
sn -k TestKey.snk
Menggunakan Notepad atau editor teks lain, tentukan kelas bernama
DynamicClass
dengan satu properti bernamaMessage
.Simpan teks sebagai file bernama ClickOnceLibrary.cs atau ClickOnceLibrary.vb, tergantung pada bahasa yang Anda gunakan, ke direktori ClickOnceOnDemand.
Kompilasi file ke dalam rakitan.
Untuk mendapatkan token kunci publik untuk rakitan, gunakan perintah berikut:
sn -T ClickOnceLibrary.dll
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); } } }
Dalam kode, temukan panggilan ke LoadFile.
Atur
PublicKeyToken
ke nilai yang Anda ambil sebelumnya.Simpan file sebagai Form1.cs atau Form1.vb.
Kompilasi ke dalam executable menggunakan perintah berikut.
Menandai rakitan sebagai opsional
Untuk menandai rakitan sebagai opsional di aplikasi ClickOnce Anda dengan menggunakan MageUI.exe
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
ClickOnceOnDemand
aplikasi .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 .
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
ClickOnceOnDemand
penyebaran .
- Beri nama manifes
Menguji rakitan baru
Untuk menguji rakitan sesuai permintaan Anda
Unggah penyebaran ClickOnce Anda ke server Web.
Mulai aplikasi Anda yang disebarkan dengan ClickOnce dari browser Web dengan memasukkan URL ke manifes penyebaran. Jika Anda memanggil aplikasi
ClickOnceOnDemand
ClickOnce , dan Mengunggahnya ke direktori akar adatum.com, URL Anda akan terlihat seperti ini:http://www.adatum.com/ClickOnceOnDemand/ClickOnceOnDemand.application
Saat formulir utama Anda muncul, tekan Button. Anda akan melihat string di jendela kotak pesan yang berbunyi "Halo, Dunia!".
Konten terkait
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk