チュートリアル: デザイナーを使用し、ClickOnce 配置 API を使用して必要に応じてアセンブリをダウンロードする

既定では、ClickOnce アプリケーションに含まれるすべてのアセンブリが、アプリケーションを初めて実行したときにダウンロードされます。 ただし、アプリケーションには少数のユーザーにしか使われない部分が含まれることがあります。 その場合は、そのような型を作成するときにだけアセンブリをダウンロードすることができます。 以下のチュートリアルでは、アプリケーション内の特定のアセンブリに "オプション" マークを付ける方法、および共通言語ランタイムでそのアセンブリが必要なときに System.Deployment.Application 名前空間にあるクラスを使用してアセンブリをダウンロードする方法について説明します。

Note

NET Core および .NET 5 以降のバージョンでは、System.Deployment.Application 名前空間内の ApplicationDeployment クラスと API はサポートされていません。 .NET 7 では、アプリケーションの配置プロパティにアクセスするための新しいメソッドがサポートされています。 詳細については、.NET の ClickOnce 配置プロパティへのアクセスに関するページを参照してください。 .NET 7 では、ApplicationDeployment メソッドと同等のメソッドはサポートされていません。

Note

これを行うには、アプリケーションが完全な信頼で実行する必要があります。

Note

実際に画面に表示されるダイアログ ボックスとメニュー コマンドは、アクティブな設定またはエディションによっては、ヘルプの説明と異なる場合があります。 設定を変更するには、 [ツール] メニューの [設定のインポートとエクスポート] をクリックします。 詳細については、「リセット設定」を参照してください。

プロジェクトを作成する

Visual Studio でオンデマンド アセンブリを使用するプロジェクトを作成するには

  1. Visual Studio で新しい Windows フォーム プロジェクトを作成します。 [ファイル] メニューの [追加] をポイントし、[新しいプロジェクト] をクリックします。 ダイアログ ボックスで [クラス ライブラリ] プロジェクトを選択し、名前を ClickOnceLibraryに設定します。

    Note

    Visual Basic でプロジェクトのプロパティを変更し、このプロジェクトのルート名前空間を Microsoft.Samples.ClickOnceOnDemand または他の適切な名前空間にすることをお勧めします。 わかりやすくするため、このチュートリアルでは 2 つのプロジェクトを同じ名前空間にします。

  2. DynamicClass という名前のプロパティを 1 つ持つ Messageという名前のクラスを定義します。

    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 フォーム プロジェクトを選択します。 System.Deployment.Application アセンブリに対する参照および ClickOnceLibrary プロジェクトに対するプロジェクト参照を追加します。

    Note

    Visual Basic でプロジェクトのプロパティを変更し、このプロジェクトのルート名前空間を Microsoft.Samples.ClickOnceOnDemand または他の適切な名前空間にすることをお勧めします。 わかりやすくするため、このチュートリアルでは 2 つのプロジェクトを同じ名前空間にします。

  4. フォームを右クリックし、メニューの [コードの表示] をクリックして、次の参照をフォームに追加します。

    using System.Reflection;
    using System.Deployment.Application;
    using Microsoft.Samples.ClickOnceOnDemand;
    using System.Security.Permissions;
    
  5. このアセンブリをオンデマンドでダウンロードする次のコードを追加します。 このコードでは、 Dictionary ジェネリック クラスを使用してアセンブリのセットをグループ名にマップする方法を示します。 このチュートリアルではダウンロードするアセンブリが 1 つだけなので、グループに含まれるアセンブリは 1 つのみです。 実際のアプリケーションでは、アプリケーションの 1 つの機能に関連するすべてのアセンブリを同時にダウンロードすることがあります。 マッピング テーブルを使用すると、機能に属しているすべての DLL をダウンロード グループ名に関連付けることにより、これを簡単に実行できます。

    // 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. [表示] メニューの [ツールボックス] をクリックします。 Button ツールボックス からフォームに をドラッグします。 ボタンをダブルクリックして、 Click イベント ハンドラーに次のコードを追加します。

    private void getAssemblyButton_Click(object sender, EventArgs e)
    {
        DynamicClass dc = new DynamicClass();
        MessageBox.Show("Message: " + dc.Message);
    }
    

アセンブリをオプションとしてマークする

Visual Studio を使用して ClickOnce アプリケーションでアセンブリをオプションとしてマークするには

  1. ソリューション エクスプローラー で Windows フォーム プロジェクトを右クリックし、 [プロパティ]をクリックします。 [発行] タブを選択します。

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

  3. ClickOnceLibrary.dll のリストを探します。 [発行の状況] ドロップダウン ボックスを [含む]に設定します。

  4. [グループ] ドロップダウン ボックスを展開し、 [新規]を選択します。 新しいグループ名として「 ClickOnceLibrary 」と入力します。

  5. 方法: 発行ウィザードを使用して ClickOnce アプリケーションを発行する」の説明に従って、アプリケーションの発行を続行します。

マニフェストの生成および編集ツールを使用して ClickOnce アプリケーションでアセンブリをオプションとしてマークするには — グラフィカル クライアント (MageUI.exe)

  1. チュートリアル: ClickOnce アプリケーションを手動で配置する」の説明に従って、ClickOnce マニフェストを作成します。

  2. MageUI.exe を終了する前に、配置のアプリケーション マニフェストを含むタブを選択し、そのタブで [ファイル] タブを選択します。

  3. アプリケーション ファイルの一覧で ClickOnceLibrary.dll を探し、 [ファイルの種類] 列を [なし]に設定します。 [グループ] 列に「 ClickOnceLibrary.dll」と入力します。

新しいアセンブリをテストする

オンデマンド アセンブリをテストするには

  1. ClickOnce で配置されたアプリケーションを起動します。

  2. メイン フォームが表示されたら、 Buttonをクリックします。 メッセージ ボックスに "Hello, World!" と表示されます。