注意:ここで紹介している方法は、Visual Studio 2005以降でのみ有効です。それ以外では、「画像やテキストファイルを実行ファイルに埋め込む」や「リソースファイルからリソースを取得する」をご覧ください。
Visual Studio 2005からはリソースデザイナを使用して、プロジェクトに追加されているリソースを管理することができます。ここではその使い方を紹介します。
リソースデザイナを表示するには、メニューの「プロジェクト」-「プロパティ」でプロジェクトデザイナを表示し、「リソース」タブを選択します(または、".resx"ファイルをソリューションエクスプローラでダブルクリックします)。
リソースを追加するには、デザイナ上部にある「リソースの追加」の右側にある下矢印をクリックして、ドロップダウンメニューから追加するリソースの種類を選択します。
リソースに文字列を追加する場合は、グリッドに「名前」、「値」、「コメント」を入力します。「コメント」は入力しなくても大丈夫です。
下の図では、「名前」を「Message」、「値」を「こんにちは。」、「説明」を「あいさつ」とした文字列リソースを追加しています。
すでにある画像やアイコン、オーディオ、テキストファイルなどのファイルをリソースに追加するには、「リソースの追加」ドロップダウンメニューから「既存のファイルの追加」を選択します。この場合、リソース名は、拡張子を除いたファイル名となります(リソース名は、リソースを選択してF2キーを押すなどにより、後から変更することができます)。
画像、アイコン、テキストファイルを新たに作成してリソースに追加することもできます。この場合は、「リソースの追加」ドロップダウンメニューから、「新しいイメージ」、「新しいアイコンの追加」、「新しいテキストファイルの追加」を選択します。リソース名を入力後、適当なエディタが表示されますので、編集して保存します。
下の図は、「Banner」という名前の画像リソースを追加したところです。
このようにして追加されたリソースの基になるファイルは、プロジェクトフォルダにあるResourcesフォルダ内にコピー(あるいは作成)されます。
文字列以外のリソースは、「プロパティ」ウィンドウにプロパティが表示されます。
Commentプロパティには、デザイナでのみ有効の、コメントを入力できます。
テキストファイルの場合は、FileTypeプロパティを変更することができ、TextかBinaryか選択することができます。FileTypeがTextの場合は、さらにEncodingプロパティを変更でき、文字コードを選択することができます。
Persistenceプロパティについては、後述します。
文字列リソースの編集法は、説明の必要はないでしょう。
ファイルリソースの場合は、リソースをダブルクリックすると、拡張子に関連付けられているエディタが起動して、編集できるようになります。例えば、JPEGファイルでは「ペイント」であったり、アイコンやテキストファイルであれば、Visual Studioで編集できたりするでしょう。また、リソースを右クリックして、コンテキストメニューで「ファイルを開くアプリケーションを選択」を選択して、編集に使うアプリケーションを指定することもできます。
補足:後述するように、埋め込まれたリソースの場合は、編集できません。
削除の方法も説明の必要はないでしょう。リソースを選択してDELETEキーを押すか、リソースエディタ上部の「削除」をクリックするだけです。
デフォルトでは、文字列以外のリソースは、リソースとなるファイルの相対パス名のみがリソースファイル(.resxファイル)に書き込まれ、リソースそのものが埋め込まれることはありません。リソースがリソースファイルに埋め込まれるようにするには、リソースのPersistenceプロパティを「実行時にリンクされました」から「.resx に埋め込まれました」に変更します。
リソースをリソースファイルに埋め込むと、リソースを別のプロジェクトで使用するときに、リソースファイルだけをコピーすれば済むという利点があります。逆に、埋め込まれたリソースは編集できないという欠点があります。
埋め込まれたリソースも、そうでないリソースも、結果的には、実行ファイル内にコンパイルされるため、どちらも変わりません。
このようにして追加されたリソースは、自動的に作成されるMy.Resourcesモジュール(C#の場合は、プロジェクト名と同じ名前の名前空間のProperties.Resourcesクラス)を使って簡単に取得できます。このクラスのリソース名と同じ名前の静的プロパティにアクセスするだけです。
'文字列リソースを取り出す Dim str As String = My.Resources.Message '画像リソースを取り出す Dim bmp As Bitmap = My.Resources.Banner 'アイコンリソースを取り出す Dim ico As Icon = My.Resources.Icon1 'オーディオリソースを取り出す Dim strm As System.IO.Stream = My.Resources.Voice1 'テキストファイルリソースを取り出す Dim txt As String = My.Resources.TextFile1 'バイナリファイルリソースを取り出す Dim bs As Byte() = My.Resources.BinaryFile
//プロジェクト名と同じ名前の名前空間内に記述されているものとする //文字列リソースを取り出す string str = Properties.Resources.Message; //画像リソースを取り出す Bitmap bmp = Properties.Resources.Banner; //アイコンリソースを取り出す Icon ico = Properties.Resources.Icon1; //オーディオリソースを取り出す System.IO.Stream strm = Properties.Resources.Voice1; //テキストファイルリソースを取り出す string txt = Properties.Resources.TextFile1; //バイナリファイルリソースを取り出す byte[] bs = Properties.Resources.BinaryFile;
このようにして作成されたリソースのリソースファイル(.resxファイル)は、プロジェクトフォルダの"My Project"フォルダ(C#では、"Properties"フォルダ)に"Resources.resx"という名前で存在します。
これ以外のリソースファイルをプロジェクトに追加することもできます。メニュー「プロジェクト」の「新しい項目の追加」や「既存項目の追加」により追加できます。このようにして追加されたリソースファイルも、Visual Studioのリソースエディタで編集できます。
Resourcesクラスが定義されているファイルも.resxファイルと同じフォルダに"(.resxファイル名).Designer.vb"(C#の場合の拡張子は、.cs)というファイル名で作成されます。
自動的に作成されるResourcesクラスの内容は、例えば次のようになります(都合により、長い行は改行しています)。リソースには文字列"Message"のみが存在しています。
'------------------------------------------------------------------------------ ' <auto-generated> ' このコードはツールによって生成されました。 ' ランタイム バージョン:2.0.50727.42 ' ' このファイルへの変更は、以下の状況下で不正な動作の原因になったり、 ' コードが再生成されるときに損失したりします。 ' </auto-generated> '------------------------------------------------------------------------------ Option Strict On Option Explicit On Imports System Namespace My.Resources 'このクラスは StronglyTypedResourceBuilder クラスが ResGen 'または Visual Studio のようなツールを使用して自動生成されました。 'メンバを追加または削除するには、.ResX ファイルを編集して、 '/str オプションと共に 'ResGen を実行し直すか、または VS プロジェクトをビルドし直します。 '''<summary> ''' ローカライズされた文字列などを検索するための、 ''' 厳密に型指定されたリソース クラスです。 '''</summary> <Global.System.CodeDom.Compiler.GeneratedCodeAttribute( _ "System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0"), _ Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _ Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _ Friend Module Resources Private resourceMan As Global.System.Resources.ResourceManager Private resourceCulture As Global.System.Globalization.CultureInfo '''<summary> ''' このクラスで使用されているキャッシュされた ''' ResourceManager インスタンスを返します。 '''</summary> <Global.System.ComponentModel.EditorBrowsableAttribute( _ Global.System.ComponentModel.EditorBrowsableState.Advanced)> _ Friend ReadOnly Property ResourceManager() As _ Global.System.Resources.ResourceManager Get If Object.ReferenceEquals(resourceMan, Nothing) Then Dim temp As Global.System.Resources.ResourceManager = _ New Global.System.Resources.ResourceManager( _ "VB1.Resources", GetType(Resources).Assembly) resourceMan = temp End If Return resourceMan End Get End Property '''<summary> ''' 厳密に型指定されたこのリソース クラスを使用して、 ''' すべての検索リソースに対し、 ''' 現在のスレッドの CurrentUICulture プロパティを ''' オーバーライドします。 '''</summary> <Global.System.ComponentModel.EditorBrowsableAttribute( _ Global.System.ComponentModel.EditorBrowsableState.Advanced)> _ Friend Property Culture() As Global.System.Globalization.CultureInfo Get Return resourceCulture End Get Set resourceCulture = value End Set End Property '''<summary> ''' こんにちは。 に類似しているローカライズされた文字列を検索します。 '''</summary> Friend ReadOnly Property Message() As String Get Return ResourceManager.GetString("Message", resourceCulture) End Get End Property End Module End Namespace
//------------------------------------------------------------------------------ // <auto-generated> // このコードはツールによって生成されました。 // ランタイム バージョン:2.0.50727.42 // // このファイルへの変更は、以下の状況下で不正な動作の原因になったり、 // コードが再生成されるときに損失したりします。 // </auto-generated> //------------------------------------------------------------------------------ namespace CS1.Properties { using System; /// <summary> /// ローカライズされた文字列などを検索するための、 /// 厳密に型指定されたリソース クラスです。 /// </summary> // このクラスは StronglyTypedResourceBuilder クラスが ResGen // または Visual Studio のようなツールを使用して自動生成されました。 // メンバを追加または削除するには、.ResX ファイルを編集して、 // /str オプションと共に // ResGen を実行し直すか、または VS プロジェクトをビルドし直します。 [global::System.CodeDom.Compiler.GeneratedCodeAttribute( "System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute( "Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } /// <summary> /// このクラスで使用されているキャッシュされた /// ResourceManager インスタンスを返します。 /// </summary> [global::System.ComponentModel.EditorBrowsableAttribute( global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager( "CS1.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } /// <summary> /// 厳密に型指定されたこのリソース クラスを使用して、 /// すべての検索リソースに対し、 /// 現在のスレッドの CurrentUICulture プロパティを /// オーバーライドします。 /// </summary> [global::System.ComponentModel.EditorBrowsableAttribute( global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// <summary> /// こんにちは。 に類似しているローカライズされた文字列を検索します。 /// </summary> internal static string Message { get { return ResourceManager.GetString("Message", resourceCulture); } } } }
このように、自動的に作成されたResourcesクラスのアクセス修飾子は通常Friend(C#では、internal)になります。Visual Studio 2008以降では、これをPublicにする方法があります。
Visual Studio 2008以降では、プロジェクトデザイナのリソースページ上部右側に「アクセス修飾子」という項目が表示され、FriendかPublic(C#では、InternalかPublic)を選択できます。ここでPublicを選択すると、Resourcesクラスと一部のメンバがPublicになります。
または、ソリューションエクスプローラでリソースファイルを選択し、プロパティウィンドウの「カスタムツール」の項目を「ResXFileCodeGenerator」から「PublicResXFileCodeGenerator」に変更します。(上記「アクセス修飾子」を「Public」に変更すると、自動的に「カスタムツール」が「PublicResXFileCodeGenerator」になります。)
Visual Studio 2005ではこのようなことができませんが、「Extended Strongly Typed Resource Generator」で公開されているようなツールを使用することで、可能になるようです。
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。