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

サテライト アセンブリを使用すると、複数のカルチャに対して Windows フォーム アプリケーションを構成できます。 サテライト アセンブリ とは、アプリケーションの既定のカルチャ以外のカルチャ用アプリケーション リソースを含むアセンブリのことです。

ClickOnce アプリケーションのローカライズ」で説明しているように、同じ ClickOnce 配置内に複数のカルチャ用の複数のサテライト アセンブリを含めることができます。 既定では、ClickOnce により配置に含まれるすべてのサテライト アセンブリがクライアント コンピューターにダウンロードされます。ただし、多くの場合、1 つのクライアントに必要なサテライト アセンブリは 1 つだけです。

このチュートリアルでは、サテライト アセンブリをオプションとしてマークする方法、および現在のカルチャ設定にクライアント コンピューターが必要とするアセンブリのみをダウンロードする方法について説明します。 次の手順では、Windows ソフトウェア開発キット (SDK) で使用できるツールを使用します。 このタスクを Visual Studio で行なうこともできます。 「チュートリアル: デザイナーを使用し、ClickOnce 配置 API で必要に応じてサテライト アセンブリをダウンロードする」または「チュートリアル: デザイナーを使用し、ClickOnce 配置 API で必要に応じてサテライト アセンブリをダウンロードする」もご覧ください。

Note

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

Note

次のコード例は、テストを目的としているため、プログラム内でカルチャを ja-JPに設定しています。 このコードを運用環境用に調整する方法については、このトピックの「次の手順」セクションを参照してください。

前提条件

このトピックでは、ローカライズされたリソースを、Visual Studio を使用してアプリケーションに追加する方法を理解していることを想定しています。 手順について詳しくは、「チュートリアル: Windows フォームのローカリゼーション」をご覧ください。

必要に応じてサテライト アセンブリをダウンロードするには

  1. アプリケーションに次のコードを追加して、サテライト アセンブリのオンデマンドでのダウンロードを有効にします。

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using System.Threading;
    using System.Globalization;
    using System.Deployment.Application;
    using System.Reflection;
    
    namespace ClickOnce.SatelliteAssemblies
    {
        static class Program
        {
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Thread.CurrentThread.CurrentUICulture = new CultureInfo("ja-JP");
    
                // Call this before initializing the main form, which will cause the resource manager
                // to look for the appropriate satellite assembly.
                GetSatelliteAssemblies(Thread.CurrentThread.CurrentCulture.ToString());
    
                Application.Run(new Form1());
            }
    
            static void GetSatelliteAssemblies(string groupName)
            {
                if (ApplicationDeployment.IsNetworkDeployed)
                {
                    ApplicationDeployment deploy = ApplicationDeployment.CurrentDeployment;
    
                    if (deploy.IsFirstRun)
                    {
                        try
                        {
                            deploy.DownloadFileGroup(groupName);
                        }
                        catch (DeploymentException de)
                        {
                            // Log error. Do not report error to the user, as there may not be a satellite
                            // assembly if the user's culture and the application's default culture match.
                        }
                    }
                }
            }
    
        }
    }
    
  2. Resgen.exe (リソース ファイル ジェネレーター) または Visual Studio を使用して、アプリケーションのサテライト アセンブリを生成します。

  3. MageUI.exe を使用して、アプリケーション マニフェストを生成するか、または既存のアプリケーション マニフェストを開きます。 このツールの詳細については、「MageUI.exe (マニフェスト生成および編集ツールのグラフィカル クライアント)」を参照してください。

  4. [Files] タブをクリックします。

  5. 省略記号 (...) ボタンをクリックして、アプリケーションのすべてのアセンブリとファイル (Resgen.exe を使用して生成したサテライト アセンブリを含む) を格納しているディレクトリを選択します (サテライト アセンブリには、<isoCode>\ApplicationName.resources.dll という形式の名前があります。<isoCode> は RFC 1766 形式の言語識別子を表します。)

  6. [作成] をクリックして、配置にファイルを追加します。

  7. 各サテライト アセンブリの [省略可能] チェック ボックスをオンにします。

  8. 各サテライト アセンブリの [グループ] フィールドに ISO 言語識別子を設定します。 たとえば、日本語のサテライト アセンブリであれば、ダウンロード グループ名として「 ja-JPから入手できるツールを使用します。 これにより、ユーザーの CurrentUICulture プロパティの設定に応じて該当するサテライト アセンブリをダウンロードする、手順 1 で追加したコードが有効になります。

次のステップ

コード例を見ると、 CurrentUICulture が特定の値に設定されています。しかし、運用環境では、クライアント コンピューターに適切な値が既定で設定されるため、この行は削除する必要があります。 たとえば、アプリケーションを日本語のクライアント コンピューターで実行する場合、既定では CurrentUICultureja-JP になります。 ここでは、アプリケーションの配置前にサテライト アセンブリをテストするという趣旨でプログラムから値を設定しています。