Share via


İzlenecek yol: ClickOnce dağıtım API'siyle isteğe bağlı derlemeleri indirme

Varsayılan olarak, bir ClickOnce uygulamasına dahil edilen tüm derlemeler, uygulama ilk kez çalıştırıldığında indirilir. Ancak, uygulamanızın küçük bir kullanıcı kümesi tarafından kullanılan bölümleri olabilir. Bu durumda, derlemeyi yalnızca türlerinden birini oluşturduğunuzda indirmek istersiniz. Aşağıdaki kılavuzda, uygulamanızdaki bazı derlemelerin "isteğe bağlı" olarak nasıl işaretlenecek ve ortak dil çalışma zamanı (CLR) gerektiğinde ad alanında System.Deployment.Application sınıfları kullanarak bunları nasıl indirebileceğiniz gösterilmektedir.

Not

ApplicationDeployment Ad alanı içindeki System.Deployment.Application sınıf ve API'ler .NET Core ve .NET 5 ve sonraki sürümlerde desteklenmez. .NET 7'de, uygulama dağıtım özelliklerine erişmek için yeni bir yöntem desteklenir. Daha fazla bilgi için bkz . .NET'te ClickOnce dağıtım özelliklerine erişme. .NET 7, ApplicationDeployment yöntemlerinin eşdeğerini desteklemez.

Not

Bu yordamı kullanmak için uygulamanızın tam güven içinde çalışması gerekir.

Önkoşullar

Bu kılavuzu tamamlamak için aşağıdaki bileşenlerden birine ihtiyacınız olacaktır:

  • Windows SDK'sı. Windows SDK'sı Microsoft İndirme Merkezi'nden indirilebilir.

  • Visual Studio.

Projeleri oluşturma

İsteğe bağlı derleme kullanan bir proje oluşturmak için

  1. ClickOnceOnDemand adlı bir dizin oluşturun.

  2. Windows SDK Komut İstemi'ni veya Visual Studio Komut İstemi'ni açın.

  3. ClickOnceOnDemand dizinine geçin.

  4. Aşağıdaki komutu kullanarak bir ortak/özel anahtar çifti oluşturun:

    sn -k TestKey.snk
    
  5. Not Defteri veya başka bir metin düzenleyicisi kullanarak adlı tek bir özellik ile adlı DynamicClassMessagebir sınıf tanımlayın.

    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!");
                }
            }
        }
    }
    
  6. Metni, kullandığınız dile bağlı olarak ClickOnceLibrary.cs veya ClickOnceLibrary.vb adlı bir dosya olarak ClickOnceOnDemand dizinine kaydedin.

  7. Dosyayı bir derlemede derleyin.

    csc /target:library /keyfile:TestKey.snk ClickOnceLibrary.cs
    
  8. Derlemenin ortak anahtar belirtecini almak için aşağıdaki komutu kullanın:

    sn -T ClickOnceLibrary.dll
    
  9. Metin düzenleyicinizi kullanarak yeni bir dosya oluşturun ve aşağıdaki kodu girin. Bu kod, gerektiğinde ClickOnceLibrary derlemesini indiren bir Windows Forms uygulaması oluşturur.

    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);
            }
        }
    }
    
  10. Kodda çağrısı LoadFilebulun.

  11. Daha önce aldığınız değere ayarlayınPublicKeyToken .

  12. Dosyayı Form1.cs veya Form1.vb olarak kaydedin.

  13. Aşağıdaki komutu kullanarak bir yürütülebilir dosyada derleyin.

    csc /target:exe /reference:ClickOnceLibrary.dll Form1.cs
    

Derlemeleri isteğe bağlı olarak işaretleme

MageUI.exe kullanarak ClickOnce uygulamanızda derlemeleri isteğe bağlı olarak işaretlemek için

  1. MageUI.exe kullanarak, İzlenecek Yol: ClickOnce uygulamasını el ile dağıtma başlığı altında açıklandığı gibi bir uygulama bildirimi oluşturun. Uygulama bildirimi için aşağıdaki ayarları kullanın:

    • Uygulama bildirimini olarak adlandırın ClickOnceOnDemand.

    • Dosyalar sayfasındaki ClickOnceLibrary.dll satırında Dosya Türü sütununu Yok olarak ayarlayın.

    • Dosyalar sayfasındaki ClickOnceLibrary.dll satırına Grup sütununa yazınClickOnceLibrary.dll.

  2. MageUI.exe kullanarak, İzlenecek Yol: ClickOnce uygulamasını el ile dağıtma başlığı altında açıklandığı gibi bir dağıtım bildirimi oluşturun. Dağıtım bildirimi için aşağıdaki ayarları kullanın:

    • Dağıtım bildirimini olarak adlandırın ClickOnceOnDemand.

Yeni derlemeyi test etme

İsteğe bağlı derlemenizi test etmek için

  1. ClickOnce dağıtımınızı bir Web sunucusuna yükleyin.

  2. Dağıtım bildiriminin URL'sini girerek clickOnce ile dağıtılan uygulamanızı bir Web tarayıcısından başlatın. ClickOnce uygulamanızı ClickOnceOnDemandçağırır ve adatum.com kök dizinine yüklerseniz, URL'niz şöyle görünür:

    http://www.adatum.com/ClickOnceOnDemand/ClickOnceOnDemand.application
    
  3. Ana formunuz göründüğünde tuşuna Buttonbasın. İleti kutusu penceresinde "Hello, World!" yazan bir dize görmeniz gerekir.