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

既定では、 ClickOnceClickOnce アプリケーションに含まれるすべてのアセンブリが、アプリケーションを初めて実行したときにダウンロードされます。By default, all the assemblies included in a ClickOnceClickOnce application are downloaded when the application is first run. ただし、アプリケーションには少数のユーザーにしか使われない部分が含まれることがあります。However, there might be parts of your application that are used by a small set of the users. その場合は、そのような型を作成するときにだけアセンブリをダウンロードすることができます。In this case, you want to download an assembly only when you create one of its types. 以下のチュートリアルでは、アプリケーション内の特定のアセンブリに "オプション" マークを付ける方法、および共通言語ランタイムでそのアセンブリが必要なときに 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 demands them.

Note

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

Note

実際に画面に表示されるダイアログ ボックスとメニュー コマンドは、アクティブな設定またはエディションによっては、ヘルプの説明と異なる場合があります。The dialog boxes and menu commands you see might differ from those described in Help depending on your active settings or edition. 設定を変更するには、 [ツール] メニューの [設定のインポートとエクスポート] をクリックします。To change your settings, click Import and Export Settings on the Tools menu. 詳細については、「リセット設定」を参照してください。For more information, see Reset settings.

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

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

  1. Visual StudioVisual Studioで新しい Windows フォーム プロジェクトを作成します。Create a new Windows Forms project in Visual StudioVisual Studio. [ファイル] メニューの [追加] をポイントし、 [新しいプロジェクト] をクリックします。On the File menu, point to Add, and then click New Project. ダイアログ ボックスで [クラス ライブラリ] プロジェクトを選択し、名前を ClickOnceLibraryに設定します。Choose a Class Library project in the dialog box and name it ClickOnceLibrary.

    Note

    Visual Basic でプロジェクトのプロパティを変更し、このプロジェクトのルート名前空間を Microsoft.Samples.ClickOnceOnDemand または他の適切な名前空間にすることをお勧めします。In Visual Basic, we recommend that you modify the project properties to change the root namespace for this project to Microsoft.Samples.ClickOnceOnDemand or to a namespace of your choice. わかりやすくするため、このチュートリアルでは 2 つのプロジェクトを同じ名前空間にします。For simplicity, the two projects in this walkthrough are in the same namespace.

  2. DynamicClass という名前のプロパティを 1 つ持つ Messageという名前のクラスを定義します。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!");
                }
            }
        }
    }
    
  3. ソリューション エクスプローラーで Windows フォーム プロジェクトを選択します。Select the Windows Forms project in Solution Explorer. System.Deployment.Application アセンブリに対する参照および ClickOnceLibrary プロジェクトに対するプロジェクト参照を追加します。Add a reference to the System.Deployment.Application assembly and a project reference to the ClickOnceLibrary project.

    Note

    Visual Basic でプロジェクトのプロパティを変更し、このプロジェクトのルート名前空間を Microsoft.Samples.ClickOnceOnDemand または他の適切な名前空間にすることをお勧めします。In Visual Basic, we recommend that you modify the project properties to change the root namespace for this project to Microsoft.Samples.ClickOnceOnDemand or to a namespace of your choice. わかりやすくするため、このチュートリアルでは 2 つのプロジェクトを同じ名前空間にします。For simplicity, the two projects in this walkthrough are located in the same namespace.

  4. フォームを右クリックし、メニューの [コードの表示] をクリックして、次の参照をフォームに追加します。Right-click the form, click View Code from the menu, and add the following references to the form.

    using System.Reflection;
    using System.Deployment.Application;
    using Microsoft.Samples.ClickOnceOnDemand;
    using System.Security.Permissions;
    
    Imports System.Reflection
    Imports System.Deployment.Application
    Imports System.Collections.Generic
    Imports Microsoft.Samples.ClickOnceOnDemand
    Imports System.Security.Permissions
    
  5. このアセンブリをオンデマンドでダウンロードする次のコードを追加します。Add the following code to download this assembly on demand. このコードでは、 Dictionary ジェネリック クラスを使用してアセンブリのセットをグループ名にマップする方法を示します。This code shows how to map a set of assemblies to a group name using a generic Dictionary class. このチュートリアルではダウンロードするアセンブリが 1 つだけなので、グループに含まれるアセンブリは 1 つのみです。Because we are only downloading a single assembly in this walkthrough, there is only one assembly in our group. 実際のアプリケーションでは、アプリケーションの 1 つの機能に関連するすべてのアセンブリを同時にダウンロードすることがあります。In a real application, you would likely want to download all assemblies related to a single feature in your application at the same time. マッピング テーブルを使用すると、機能に属しているすべての DLL をダウンロード グループ名に関連付けることにより、これを簡単に実行できます。The mapping table enables you to do this easily by associating all the DLLs that belong to a feature with a download group name.

    // 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);
    }
    
    ' 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
    
  6. [表示] メニューの [ツールボックス] をクリックします。On the View menu, click Toolbox. Button ツールボックス からフォームに をドラッグします。Drag a Button from the Toolbox onto the form. ボタンをダブルクリックして、 Click イベント ハンドラーに次のコードを追加します。Double-click the button and add the following code to the Click event handler.

    private void getAssemblyButton_Click(object sender, EventArgs e)
    {
        DynamicClass dc = new DynamicClass();
        MessageBox.Show("Message: " + dc.Message);
    }
    
    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
    

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

Visual Studio を使用して ClickOnce アプリケーションでアセンブリをオプションとしてマークするにはTo mark assemblies as optional in your ClickOnce application by using Visual Studio

  1. ソリューション エクスプローラー で Windows フォーム プロジェクトを右クリックし、 [プロパティ] をクリックします。Right-click the Windows Forms project in Solution Explorer and click Properties. [発行] タブを選択します。Select the Publish tab.

  2. [アプリケーション ファイル] ボタンをクリックします。Click the Application Files button.

  3. ClickOnceLibrary.dll のリストを探します。Find the listing for ClickOnceLibrary.dll. [発行の状況] ドロップダウン ボックスを [含む] に設定します。Set the Publish Status drop-down box to Include.

  4. [グループ] ドロップダウン ボックスを展開し、 [新規] を選択します。Expand the Group drop-down box and select New. 新しいグループ名として「 ClickOnceLibrary 」と入力します。Enter the name ClickOnceLibrary as the new group name.

  5. 」の説明に従って、アプリケーションの発行を続行方法。発行ウィザードを使用して ClickOnce アプリケーションを発行する」を参照してください。Continue publishing your application as described in How to: Publish a ClickOnce application using the Publish Wizard.

マニフェストの生成および編集ツールを使用して ClickOnce アプリケーションでアセンブリをオプションとしてマークするには — グラフィカル クライアント (MageUI.exe)To mark assemblies as optional in your ClickOnce application by using Manifest Generation and Editing Tool — Graphical Client (MageUI.exe)

  1. 作成、 ClickOnceClickOnce 」の説明に従ってマニフェストチュートリアル。ClickOnce アプリケーションを手動で展開します。Create your ClickOnceClickOnce manifests as described in Walkthrough: Manually deploy a ClickOnce application.

  2. MageUI.exe を終了する前に、配置のアプリケーション マニフェストを含むタブを選択し、そのタブで [ファイル] タブを選択します。Before closing MageUI.exe, select the tab that contains your deployment's application manifest, and within that tab select the Files tab.

  3. アプリケーション ファイルの一覧で ClickOnceLibrary.dll を探し、 [ファイルの種類] 列を [なし] に設定します。Find ClickOnceLibrary.dll in the list of application files and set its File Type column to None. [グループ] 列に「 ClickOnceLibrary.dll」と入力します。For the Group column, type ClickOnceLibrary.dll.

新しいアセンブリをテストします。Test the new assembly

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

  1. ClickOnceClickOnceで配置されたアプリケーションを起動します。Start your application deployed with ClickOnceClickOnce.

  2. メイン フォームが表示されたら、 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