Aracılığıyla paylaş


İ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

  1. 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.

  2. 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!");
                }
            }
        }
    }
    
  3. Çö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.

  4. 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;
    
  5. İ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);
    }
    
  6. 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

  1. Çözüm Gezgini'nde Windows Forms'a tıklayın ve Özellikler'i seçin. Yayımla sekmesini seçin.

  2. Uygulama Dosyaları düğmesini tıklayın.

  3. ClickOnceLibrary.dll için listeyi bulun. Publish Status (Yayımla Durumu) açılır kutusunu Dahil Et'e ayarlayın.

  4. Grup açılır kutusunu genişletin ve Yeni'yi seçin. Yeni grup adı olarak ClickOnceLibrary adını girin.

  5. 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

  1. İzlenecek Yol: ClickOnce Uygulamasını El ile Dağıtma bağlantısında açıklandığı gibi ClickOnce bildirimlerinizi oluşturun.

  2. 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.

  3. 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

  1. ClickOnce ile dağıtılan uygulamanızı başlatın.

  2. Ana form görüntülendiğinde Button tuşuna basın. Bir ileti kutusu penceresinde "Hello World!" yazılı bir dize görmelisiniz.

Ayrıca bkz.

Başvuru

ApplicationDeployment