次の方法で共有


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

既定では、ClickOnce アプリケーションに含まれるすべてのアセンブリは、アプリケーションの初回実行時にダウンロードされます。 ただし、アプリケーションの一部が少数のユーザーによって使用される場合があります。 この場合、アセンブリをダウンロードするのは、その型の 1 つを作成する場合のみです。 次のチュートリアルでは、アプリケーション内の特定のアセンブリを "省略可能" としてマークする方法と、共通言語ランタイムで要求されたときに System.Deployment.Application 名前空間のクラスを使用してアセンブリをダウンロードする方法を示します。

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

この手順を使用するには、アプリケーションを完全に信頼して実行する必要があります。

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

プロジェクトを作成する

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

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

    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 プロジェクトへのプロジェクト参照を追加します。

    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!" という文字列が表示されます。