DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

Visual Studioでリソースを管理する

注意:ここで紹介している方法は、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クラス)を使って簡単に取得できます。このクラスのリソース名と同じ名前の静的プロパティにアクセスするだけです。

VB.NET
コードを隠すコードを選択
'文字列リソースを取り出す
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
C#
コードを隠すコードを選択
//プロジェクト名と同じ名前の名前空間内に記述されているものとする

//文字列リソースを取り出す
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クラスの内容

自動的に作成されるResourcesクラスの内容は、例えば次のようになります(都合により、長い行は改行しています)。リソースには文字列"Message"のみが存在しています。

VB.NET
コードを隠すコードを選択
'------------------------------------------------------------------------------
' <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
C#
コードを隠すコードを選択
//------------------------------------------------------------------------------
// <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クラスをPublicにする

このように、自動的に作成された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」で公開されているようなツールを使用することで、可能になるようです。

  • 履歴:
  • 2016/6/19 「ResourcesクラスをPublicにする」を追加。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。