チュートリアル: デザイナーを使用し、ClickOnce 配置 API を使用して必要に応じてサテライト アセンブリをダウンロードする
サテライト アセンブリを使用すると、複数のカルチャに対して Windows フォーム アプリケーションを構成できます。 サテライト アセンブリ とは、アプリケーションの既定のカルチャ以外のカルチャ用アプリケーション リソースを含むアセンブリのことです。
「ClickOnce アプリケーションのローカライズ」で説明しているように、同じ ClickOnce 配置内に複数のカルチャ用の複数のサテライト アセンブリを含めることができます。 既定では、ClickOnce により配置に含まれるすべてのサテライト アセンブリがクライアント コンピューターにダウンロードされます。ただし、多くの場合、1 つのクライアントに必要なサテライト アセンブリは 1 つだけです。
このチュートリアルでは、サテライト アセンブリをオプションとしてマークする方法、および現在のカルチャ設定にクライアント コンピューターが必要とするアセンブリのみをダウンロードする方法について説明します。
Note
NET Core および .NET 5 以降のバージョンでは、System.Deployment.Application 名前空間内の ApplicationDeployment クラスと API はサポートされていません。 .NET 7 では、アプリケーションの配置プロパティにアクセスするための新しいメソッドがサポートされています。 詳細については、.NET の ClickOnce 配置プロパティへのアクセスに関するページを参照してください。 .NET 7 では、ApplicationDeployment メソッドと同等のメソッドはサポートされていません。
Note
次のコード例は、テストを目的としているため、プログラム内でカルチャを ja-JP
に設定しています。 このコードを運用環境用に調整する方法については、このトピックの「次の手順」セクションを参照してください。
サテライト アセンブリをオプションとしてマークするには
プロジェクトをビルドする。 これにより、ローカライズの対象としているすべてのカルチャについて、サテライト アセンブリが生成されます。
ソリューション エクスプローラーでご利用のプロジェクト名を右クリックし、[プロパティ] をクリックします。
[発行] タブをクリックし、[アプリケーション ファイル] をクリックします。
[すべてのファイルを表示] チェック ボックスをオンにして、サテライト アセンブリを表示します。 既定では、すべてのサテライト アセンブリが配置対象に含められ、このダイアログ ボックスに表示されます。
サテライト アセンブリには、<isoCode>\ApplicationName.resources.dll という形式の名前があります。<isoCode> は RFC 1766 形式の言語識別子を表します。
各言語識別子の [ダウンロード グループ] リストで、[新規作成] をクリックします。 ダウンロード グループ名の入力を求めるメッセージが表示されたら、言語識別子を入力します。 たとえば、日本語のサテライト アセンブリであれば、ダウンロード グループ名
ja-JP
を指定します。[アプリケーション ファイル] ダイアログ ボックスを閉じます。
必要に応じてサテライト アセンブリをダウンロードするには (C#)
Program.cs ファイルを開きます。 このファイルがソリューション エクスプローラーに表示されない場合は、プロジェクトを選択し、[プロジェクト] メニューの [すべてのファイルを表示] をクリックします。
該当するサテライト アセンブリをダウンロードし、アプリケーションを起動するには、次のコードを使用します。
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 this error to the user, because a satellite // assembly may not exist if the user's culture and the application's // default culture match. } } } } } }
必要に応じてサテライト アセンブリをダウンロードするには (Visual Basic)
アプリケーションの [プロパティ] ウィンドウで、[アプリケーション] タブをクリックします。
タブ ページの一番下にある [アプリケーション イベントの表示] をクリックします。
ApplicationEvents.VB ファイルの先頭に、次のインポートを追加します。
Imports System.Deployment.Application Imports System.Globalization Imports System.Threading
MyApplication
クラスに次のコードを追加します。Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup Thread.CurrentThread.CurrentUICulture = New CultureInfo("ja-JP") GetSatelliteAssemblies(Thread.CurrentThread.CurrentUICulture.ToString()) End Sub Private Shared Sub GetSatelliteAssemblies(ByVal groupName As String) If (ApplicationDeployment.IsNetworkDeployed) Then Dim deploy As ApplicationDeployment = ApplicationDeployment.CurrentDeployment If (deploy.IsFirstRun) Then Try deploy.DownloadFileGroup(groupName) Catch de As DeploymentException ' Log error. Do not report this error to the user, because a satellite ' assembly may not exist if the user's culture and the application's ' default culture match. End Try End If End If End Sub
次のステップ
コード例を見ると、CurrentUICulture が特定の値に設定されています。しかし、運用環境では、クライアント コンピューターに適切な値が既定で設定されるため、この行は削除する必要があります。 たとえば、アプリケーションを日本語のクライアント コンピューターで実行する場合、既定では CurrentUICulture が ja-JP
になります。 ここでは、アプリケーションの配置前にサテライト アセンブリをテストするという趣旨でプログラムから設定しています。