İzlenecek Yol: Tasarımcıyı Kullanarak ClickOnce Dağıtımı API'si ile İstek Üzerine Bütünleştirilmiş Kodları İndirme
Varsayılan değer olarak, uygulama ilk olarak çalıştığında ClickOnce uygulaması içinde bulunan tüm bütünleştirilmiş kodlar karşıdan yüklenir. Ancak, uygulamanızın küçük bir kullanıcı grubu tarafından kullanılan parçaları var olabilir. Bu durumda, yalnızca bütünleştirilmiş kod türlerinden birini oluşturduğunuzda bütünleştirilmiş kodu karşıdan yüklemek istersiniz. Aşağıdaki izlenecek yol (walkthrough), uygulamanızda belirli bütünleştirilmiş kodları nasıl "isteğe bağlı" şeklinde işaretleyeceğinizi ve ortak dil çalışma zamanı bunları talep ettiğinde System.Deployment.Application isim uzayında yer alan sınıfları kullanarak bunların nasıl karşıdan yüklendiğini gösterir.
Not
Bu yordamı kullanabilmek için uygulamanızın tam güvende çalışması gerekir.
Not
Gördüğünüz iletişim kutuları ve menü komutları, etkin ayarlarınıza ve ürün sürümüne bağlı olarak Yardım menüsünde açıklanana göre farklılık gösterebilir. Ayarlarınızı değiştirmek için Araçlar menüsünden İçe Dışa Aktarım Ayarları'nı seçin. Daha fazla bilgi için bkz. Ayarlar ile çalışma.
Proje Oluşturma
Visual Studio ile isteğe bağlı bütünleştirilmiş kod kullanan bir proje oluşturmak için
Visual Studio içinde yeni bir Windows Forms projesi oluşturun. Dosya menüsünde, Yeni'nin üzerine gelin ve Proje'ye tıklayın. İletişimi kutusunda Sınıf Kitaplığı projesini seçin ve bunu ClickOnceLibrary olarak adlandırın.
Not
Visual Basic'te, proje özelliklerini değiştirmek üzere kök isim uzayını bu proje için Microsoft.Samples.ClickOnceOnDemand'e veya istediğiniz bir ad uzayına çevirmenizi öneririz. Kolaylık için bu izlenecek yolda iki proje aynı isim uzayındadırlar.
Message olarak adlandırılan tek bir özellikle DynamicClass olarak adlandırılan bir sınıfı tanımlar.
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!"); } } } }
Çözüm Gezgini'nde Windows Forms projesi seçin. System.Deployment.Application'a bir başvuru ve ClickOnceLibrary projesine bir proje başvurusu ekleyin.
Not
Visual Basic'te, proje özelliklerini değiştirmek üzere kök isim uzayını bu proje için Microsoft.Samples.ClickOnceOnDemand'e veya istediğiniz bir ad uzayına çevirmenizi öneririz. Kolaylık için bu izlenecek yolda iki proje aynı isim uzayındadırlar.
Forma sağ tıklayın, menüden Kod Göster'i tıklayın ve aşağıdaki başvuruları forma ekleyin.
Imports System.Reflection Imports System.Deployment.Application Imports System.Collections.Generic Imports Microsoft.Samples.ClickOnceOnDemand Imports System.Security.Permissions
using System.Reflection; using System.Deployment.Application; using Microsoft.Samples.ClickOnceOnDemand; using System.Security.Permissions;
İstek üzerine bu bütünleştirilmiş kodu karşıdan yüklemesi için aşağıdaki kodu ekleyin. Bu kod genel Dictionary sınıfını kullanarak bir grup adına nasıl bütünleştirilmiş kodlar kümesi eşleştirebileceğinizi gösterir. Çünkü bu izlenecek yolda sadece tek bir bütünleştirilmiş kod karşıdan yüklüyoruz, grubumuzda sadece bir bütünleştirilmiş kod var. Gerçek bir uygulamada, büyük olasılıkla aynı anda uygulamanızdaki tek bir özellikle ilgili tüm bütünleştirilmiş kodları indirmek isteyeceksiniz. Eşleme tablosu, karşıdan yüklenenler grup adı ile bir özelliğe ait olan tüm DLL'leri ilişkilendirerek bunu kolayca yapmanızı sağlar.
' 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 DllMappingTable As New Dictionary(Of String, String)() <SecurityPermission(SecurityAction.Demand, ControlAppDomain:=True)> _ Sub New() ' This call is required by the Windows Form Designer. InitializeComponent() ' Add any initialization after the InitializeComponent() call. DllMappingTable("ClickOnceLibrary") = "ClickOnceLibrary" End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf Me.CurrentDomain_AssemblyResolve End Sub Private Function CurrentDomain_AssemblyResolve(ByVal sender As Object, ByVal args As ResolveEventArgs) As System.Reflection.Assembly Dim NewAssembly As Assembly = Nothing If (ApplicationDeployment.IsNetworkDeployed) Then Dim Deploy As ApplicationDeployment = ApplicationDeployment.CurrentDeployment ' Get the DLL name from the argument. Dim NameParts As String() = args.Name.Split(",") Dim DllName As String = NameParts(0) Dim DownloadGroupName As String = DllMappingTable(DllName) Try Deploy.DownloadFileGroup(DownloadGroupName) Catch ex As Exception MessageBox.Show("Could not download file group from Web server. Contact administrator. Group name: " & DownloadGroupName & "; DLL name: " & args.Name) Throw (ex) End Try ' 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 ex As Exception Throw (ex) End Try 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.") End If Return NewAssembly End Function
// 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); }
Görünüm menüsünden Araç Kutusu'nu tıklayın. Araç Kutusu'ndan formun üzerine bir Button sürükleyin. Düğmeyi çift tıklayın ve Click olay işleyicisine aşağıdaki kodu ekleyin.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim DC As New DynamicClass() MessageBox.Show("Message is " & DC.Message) End Sub
private void getAssemblyButton_Click(object sender, EventArgs e) { DynamicClass dc = new DynamicClass(); MessageBox.Show("Message: " + dc.Message); }
Bütünleştirilmiş Kodları İsteğe Bağlı (Optional) olarak İşaretleme
Visual Studio kullanarak ClickOnce uygulamalarınızda bütünleştirilmiş kodları isteğe bağlı olarak işaretlemek için
Çözüm Gezgini'nde Windows Forms'a tıklayın ve Özellikler'i seçin. Yayımla sekmesini seçin.
Uygulama Dosyaları düğmesini tıklayın.
ClickOnceLibrary.dll için listeyi bulun. Publish Status (Yayımla Durumu) açılır kutusunu Dahil Et'e ayarlayın.
Grup açılır kutusunu genişletin ve Yeni'yi seçin. Yeni grup adı olarak ClickOnceLibrary adını girin.
Nasıl Yapılır: Yayımla Sihirbazını Kullanarak ClickOnce Uygulaması Yayımla bağlantısında açıklandığı gibi uygulamanızı yayımlamaya devam edin.
Bildirim Oluşturma ve Düzenleme Aracı — Grafik İstemcisi (MageUI.exe) kullanarak ClickOnce uygulamalarınızda bütünleştirilmiş kodları isteğe bağlı olarak işaretlemek
İzlenecek Yol: ClickOnce Uygulamasını El ile Dağıtma bağlantısında açıklandığı gibi ClickOnce bildirimlerinizi oluşturun.
MageUI.exe'yi kapatmadan önce dağıtımınızın uygulama bildirimini içeren sekmeyi seçin ve sekmenin içinde Dosyalar sekmesini seçin.
Uygulama dosyaları listesinde ClickOnceLibrary.dll'i bulun ve Dosya Türü'ni Hiçbiri olarak ayarlayın. Grup sütunu için, ClickOnceLibrary.dll yazın.
Yeni Bütünleştirilmiş Kodu Test Etme
İsteğe bağlı bütünleştirilmiş kodu test etmek için
ClickOnce ile dağıtılan uygulamanızı başlatın.
Ana form görüntülendiğinde Button tuşuna basın. Bir ileti kutusu penceresinde "Hello World!" yazılı bir dize görmelisiniz.