İzlenecek yol: Derlemeler ClickOnce dağıtımı API'si ile isteğe bağlı yükleme
Varsayılan değer olarak, uygulama ilk olarak çalıştığında ClickOnce uygulaması içinde bulunan tüm derlemeler indirilir. Ancak, uygulamanızın kullanıcıların küçük bir bölümü tarafından kullanılan parçaları olabilir. Bu durumda, yalnızca derleme türlerinden birini oluşturduğunuzda derlemeyi indirmek istersiniz. Aşağıdaki izlenecek yol (walkthrough), uygulamanızda belirli derlemeleri nasıl "isteğe bağlı" şeklinde işaretleyeceğinizi ve ortak dil çalışma zamanı (CLR) bunları talep ettiğinde System.Deployment.Application isim uzayında yer alan sınıfları kullanarak bunların nasıl indirildiğini gösterir.
Not
Bu yordamı kullanabilmek için uygulamanızın tam güvende çalışması gerekir.
Önkoşullar
İzlenecek bu yolu tamamlamak için aşağıdaki bileşenler gerekmektedir:
Windows SDK. Windows SDK, Microsoft İndirme Merkezinden indirilebilir.
Visual Studio.
Proje Oluşturma
İsteğe bağlı bir derleme kullanan bir proje oluşturmak için
ClickOnceOnDemand adlı bir dizin oluşturun.
Windows SDK Komut İstemini veya Visual Studio Komut İstemini açın.
ClickOnceOnDemand dizinine gidin:
Aşağıdaki komutu kullanarak ortak/özel bir anahtar çifti oluşturun:
sn -k TestKey.snk
Not Defteri veya başka bir metin düzenleyicisi kullanarak, Message tek özelliği olacak şekilde DynamicClass adıyla bir sınıf tanımlayın.
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!"); } } } }
Metni, kullandığınız dile bağlı olarak ClickOnceLibrary.cs veya ClickOnceLibrary.vb adıyla ClickOnceOnDemand dizinine kaydedin.
Dosyayı bir derleme içine derleyin.
csc /target:library /keyfile:TestKey.snk ClickOnceLibrary.cs
vbc /target:library /keyfile:TestKey.snk ClickOnceLibrary.vb
Derleme için ortak anahtar belirteci almak üzere, aşağıdaki komutu kullanın:
sn -T ClickOnceLibrary.dll
Metin düzenleyicinizi kullanarak yeni bir dosya oluşturun ve aşağıdaki kodu girin. Bu kod, gereken durumlarda ClickOnceLibrary derlemesini indiren bir Windows Forms uygulaması oluşturur.
Imports System Imports System.Windows.Forms Imports System.Deployment.Application Imports System.Drawing Imports System.Reflection Imports System.Collections.Generic Imports Microsoft.Samples.ClickOnceOnDemand Namespace Microsoft.Samples.ClickOnceOnDemand <System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, Unrestricted:=true)> _ Class Form1 Inherits 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. Dim DllMapping as Dictionary(Of String, String) = new Dictionary(of String, String)() Public Sub New() ' Add button to form. Dim GetAssemblyButton As New Button() GetAssemblyButton.Location = New Point(100, 100) GetAssemblyButton.Text = "Get assembly on demand" AddHandler GetAssemblyButton.Click, AddressOf GetAssemblyButton_Click Me.Controls.Add(GetAssemblyButton) DllMapping("ClickOnceLibrary") = "ClickOnceLibrary" AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf CurrentDomain_AssemblyResolve End Sub <STAThread()> _ Shared Sub Main() Application.EnableVisualStyles() Application.Run(New Form1()) End Sub Private Function CurrentDomain_AssemblyResolve(ByVal sender As Object, ByVal args As ResolveEventArgs) As Assembly If ApplicationDeployment.IsNetworkDeployed Then Dim deploy As ApplicationDeployment = ApplicationDeployment.CurrentDeployment ' Get the DLL name from the Name argument. Dim nameParts() as String = args.Name.Split(",") Dim dllName as String = nameParts(0) Dim downloadGroupName as String = DllMapping(dllName) Try deploy.DownloadFileGroup(downloadGroupName) Catch de As DeploymentException End Try ' Load the assembly. Dim newAssembly As Assembly = Nothing Try newAssembly = Assembly.LoadFile(Application.StartupPath & "\\" & dllName & ".dll," & _ "Version=1.0.0.0, Culture=en, PublicKeyToken=03689116d3a4ae33") Catch ex As Exception MessageBox.Show("Could not download assembly on demand.") End Try CurrentDomain_AssemblyResolve = newAssembly Else CurrentDomain_AssemblyResolve = Nothing End If End Function Private Sub GetAssemblyButton_Click(ByVal sender As Object, ByVal e As EventArgs) Dim ourClass As New DynamicClass() MessageBox.Show("DynamicClass string is: " + ourClass.Message) End Sub End Class End Namespace
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); } } }
Kod içinde LoadFile için yapılan çağrıyı bulun.
PublicKeyToken'i daha önce alınan değere ayarlayın.
Dosyayı Form1.cs ya da Form1.vb olarak kaydedin.
Aşağıdaki komutu kullanarak bir çalıştırılabilirin içine derleyin.
csc /target:exe /reference:ClickOnceLibrary.dll Form1.cs
vbc /target:exe /reference:ClickOnceLibrary.dll Form1.vb
Derlemeleri İsteğe Bağlı Olarak İşaretleme
MageUI.exe kullanarak ClickOnce uygulamanızda derlemeleri isteğe bağlı olarak işaretlemek için
MageUI.exe kullanarak, İzlenecek yol: El ile ClickOnce uygulama dağıtma içinde tanımlandığı gibi bir uygulama bildirimi oluşturun. Uygulama bildirimi için aşağıdaki ayarları kullanın:
Uygulama bildirimini ClickOnceOnDemand olarak adlandırın.
Dosyalar sayfasında, ClickOnceLibrary.dll satırında, Dosya Türü sütununu None (Yok) olarak ayarlayın.
Dosyalar sayfasında, ClickOnceLibrary.dll satırında, Grup sütununa ClickOnceLibrary.dll yazın.
MageUI.exe kullanarak, İzlenecek yol: El ile ClickOnce uygulama dağıtma içinde tanımlandığı gibi bir dağıtım bildirimi oluşturun. Uygulama bildirimi için aşağıdaki ayarları kullanın:
- Dağıtım bildirimini ClickOnceOnDemand olarak adlandırın.
Yeni Derlemeyi Test Etme
İsteğe bağlı derlemeyi test etmek için
ClickOnce dağıtımını bir Web sunucusuna yükleyin.
Dağıtım bildirimine URL'yi girerek bir Web tarayıcısından ClickOnce ile dağıtılan uygulamanızı başlatın. ClickOnce uygulaması ClickOnceOnDemand'i çağırırsanız ve adatum.com'un kök dizinine bunu eklerseniz, URL'niz şu şekilde görünecektir:
http://www.adatum.com/ClickOnceOnDemand/ClickOnceOnDemand.application
Ana form görüntülendiğinde Button'a basın. Bir ileti kutusu penceresinde "Hello World!" yazılı bir dize görmelisiniz.