チュートリアル: ClickOnce 配置 API で必要に応じてアセンブリをダウンロードします。Walkthrough: Download assemblies on demand with the ClickOnce deployment API

既定では、内のすべてのアセンブリに含まれる、ClickOnceClickOnceアプリケーションが、アプリケーションを初めて実行したときにダウンロードされます。By default, all of the assemblies included in a ClickOnceClickOnce application are downloaded when the application is first run. ただし、少数のユーザーによって使用される、アプリケーションの部分があります。However, you may have parts of your application that are used by a small set of your users. その場合は、そのような型を作成するときにだけアセンブリをダウンロードすることができます。In this case, you want to download an assembly only when you create one of its types. 以下のチュートリアルでは、アプリケーション内の特定のアセンブリに "オプション" マークを付ける方法、および共通言語ランタイム (CLR) でそのアセンブリが必要なときに System.Deployment.Application 名前空間にあるクラスを使用してアセンブリをダウンロードする方法について説明します。The following walkthrough demonstrates how to mark certain assemblies in your application as "optional", and how to download them by using classes in the System.Deployment.Application namespace when the common language runtime (CLR) demands them.

Note

これを行うには、アプリケーションが完全な信頼で実行する必要があります。Your application will have to run in full trust to use this procedure.

必須コンポーネントPrerequisites

このチュートリアルを完了するには、次のコンポーネントのいずれかが必要です。You will need one of the following components to complete this walkthrough:

  • Windows SDK の。The Windows SDK. Windows SDK は、Microsoft ダウンロード センターからダウンロードできます。The Windows SDK can be downloaded from the Microsoft Download Center.

  • Visual StudioVisual Studio.

プロジェクトを作成します。Create the projects

オンデマンドでアセンブリを使用するプロジェクトを作成するにはTo create a project that uses an on-demand assembly

  1. 任意のという名前のディレクトリを作成します。Create a directory named ClickOnceOnDemand.

  2. Windows SDK コマンド プロンプトを開き、またはVisual StudioVisual Studioコマンド プロンプト。Open the Windows SDK Command Prompt or the Visual StudioVisual Studio Command Prompt.

  3. 任意のディレクトリに変更します。Change to the ClickOnceOnDemand directory.

  4. 次のコマンドを使用して公開/秘密キーのペアを生成します。Generate a public/private key pair using the following command:

    sn -k TestKey.snk
    
  5. という名前のクラスを定義してメモ帳または別のテキスト エディターを使用してDynamicClassという名前の 1 つのプロパティを持つMessageします。Using Notepad or another text editor, define a class named DynamicClass with a single property named Message.

    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!");
                }
            }
        }
    }
    
  6. テキストをという名前のファイルとして保存ClickOnceLibrary.csまたはClickOnceLibrary.vb、使用する、言語に応じて、任意ディレクトリ。Save the text as a file named ClickOnceLibrary.cs or ClickOnceLibrary.vb, depending on the language you use, to the ClickOnceOnDemand directory.

  7. ファイルをアセンブリにコンパイルします。Compile the file into an assembly.

    csc /target:library /keyfile:TestKey.snk ClickOnceLibrary.cs
    
    vbc /target:library /keyfile:TestKey.snk ClickOnceLibrary.vb
    
  8. アセンブリの公開キー トークンを取得するには、次のコマンドを使用します。To get the public key token for the assembly, use the following command:

    sn -T ClickOnceLibrary.dll
    
  9. エディター、テキストを使用して新しいファイルを作成し、次のコードを入力します。Create a new file using your text editor and enter the following code. このコードは、必要な場合に、ClickOnceLibrary アセンブリをダウンロードする Windows フォーム アプリケーションを作成します。This code creates a Windows Forms application that downloads the ClickOnceLibrary assembly when it is required.

    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);
            }
        }
    }
    
    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
    
  10. コードへの呼び出しを見つけますLoadFileします。In the code, locate the call to LoadFile.

  11. 設定PublicKeyToken以前に取得した値にします。SetPublicKeyToken to the value that you retrieved earlier.

  12. いずれかとして保存Form1.csまたはForm1.vbします。Save the file as either Form1.cs or Form1.vb.

  13. 次のコマンドを使用して実行可能ファイルにコンパイルします。Compile it into an executable using the following command.

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

アセンブリをオプションとしてマークMark assemblies as optional

MageUI.exe を使用して ClickOnce アプリケーションでは省略可能としてアセンブリをマークするにはTo mark assemblies as optional in your ClickOnce application by using MageUI.exe

  1. 使用してMageUI.exe、」の説明に従って、アプリケーション マニフェストを作成チュートリアル。ClickOnce アプリケーションを手動で展開します。Using MageUI.exe, create an application manifest as described in Walkthrough: Manually deploy a ClickOnce application. アプリケーション マニフェストの次の設定を使用します。Use the following settings for the application manifest:

    • アプリケーション マニフェストの名前を付けますClickOnceOnDemandします。Name the application manifest ClickOnceOnDemand.

    • ファイル] ページの [、 ClickOnceLibrary.dll行で、設定、ファイルの種類Noneします。On the Files page, in the ClickOnceLibrary.dll row, set the File Type column to None.

    • ファイルページで、 ClickOnceLibrary.dll行に「ClickOnceLibrary.dllで、グループ列。On the Files page, in the ClickOnceLibrary.dll row, type ClickOnceLibrary.dll in the Group column.

  2. 使用してMageUI.exe、配置マニフェストの作成」の説明に従ってチュートリアル。ClickOnce アプリケーションを手動で展開します。Using MageUI.exe, create a deployment manifest as described in Walkthrough: Manually deploy a ClickOnce application. 配置マニフェストに、次の設定を使用します。Use the following settings for the deployment manifest:

    • 配置マニフェストの名前を付けますClickOnceOnDemandします。Name the deployment manifest ClickOnceOnDemand.

新しいアセンブリをテストするTesting the new assembly

オンデマンド アセンブリをテストするにはTo test your on-demand assembly

  1. アップロード、 ClickOnceClickOnce Web サーバーに配置します。Upload your ClickOnceClickOnce deployment to a Web server.

  2. デプロイされるアプリケーションを起動ClickOnceClickOnce配置マニフェストへの URL を入力して、Web ブラウザーから。Start your application deployed with ClickOnceClickOnce from a Web browser by entering the URL to the deployment manifest. 呼び出す場合、ClickOnceClickOnceアプリケーションClickOnceOnDemandadatum.com のルート ディレクトリにアップロードして、URL は次のようになります。If you call your ClickOnceClickOnce application ClickOnceOnDemand, and you upload it to the root directory of adatum.com, your URL would look like this:

    http://www.adatum.com/ClickOnceOnDemand/ClickOnceOnDemand.application
    
  3. メイン フォームが表示されたら、 Buttonをクリックします。When your main form appears, press the Button. メッセージ ボックス ウィンドウに "Hello, World!" という文字列が表示されます。You should see a string in a message box window that reads "Hello, World!".

関連項目See also