C#

C# リソースのみのDLLを作成してみる

前回、「C# プログラムでリソースを作って使う」でリソース(resx)ファイルを使った方法を紹介しました。
このリソース(resx)ファイルはXMLファイルなので、メモ帳などのテキストエディタなどで良くも悪くも変更できてしまいます。

今回は、リソースとしてアクセスはするが、外部からの変更は行わない「リソースDLL」を作成してみます。

 

まずは準備

今回の「リソースDLL」と、この「リソースDLLを使うプログラム」2つのプロジェクトを作成します。

リソースDLLは「クラスライブラリ」、リソースDLLを使うプログラムは「Windowsアプリケーション」で作成し、リソースDLLを参照するように設定をします。

 

リソースDLLを作成する

リソースDLL側のプロジェクトはクラスライブラリの最初のクラス”Class1.cs”というファイルがありますが、リソースのみで、この”Class1.cs”は使用しないので削除します。
それから、プロジェクト名を右クリックして[追加] – [新しい項目]から「リソースファイル」を選択します。

 

リソースファイルを追加すると文字列リソースを作成・編集するためのグリッドが表示されます。

 

リソースの準備

このときにリソースのグリッドの上部に「アクセス修飾子(i):」という項目があり、最初は’Internal’になっています。
アクセス修飾子のドロップダウンを開いて’Public’に変更しておきます。

 

そして、このグリッドにリソース(今回は文字列のみ)を追加します。

今回のサンプルで追加したリソース

名前 コメント
Hello_en_us Good morning. How are you? 英語
Hello_ja おはよう、元気ですか? 日本語
Hello_zh_cn 早上好,你怎么样? 中国語

 

リソースを準備できたらこのDLLをビルドしておきます。

 

リソースDLLを使うプログラムを作成する

次に先ほど作成したリソースDLLを使ったプログラムのほうを作成します。

下記のようなコードを準備します。

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //
            comboBox1.Items.Clear();
            comboBox1.Items.Add("English");
            comboBox1.Items.Add("日本語");
            comboBox1.Items.Add("中文");
        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            //
            this.Close();
        }

        private void btnChange_Click(object sender, EventArgs e)
        {
            //

            // リソース名"Hello_**"の文字列リソースを取得する
            // "Hello_en_us" ... 英語
            // "Hello_ja" ... 日本語
            // "Hello_zh_cn" ... 中国語
            string message;
            switch (comboBox1.SelectedIndex)
            {
                case 1: // "日本語"を選んだ場合
                    message = ResourceDLL.MyResource.Hello_ja;
                    break;
                case 2: // "中文"を選んだ場合
                    message = ResourceDLL.MyResource.Hello_zh_cn;
                    break;
                case 0: // "English"を選んだ場合
                default:
                    message = ResourceDLL.MyResource.Hello_en_us;
                    break;
            }

            lblTitle.Text = message;
        }
    }

リソースのアクセス部分は、

<リソースDLLの名前空間>.<リソースのクラス名>.<リソースの名前>

となります(リソースの値をプロパティで取得する形になります)。

<リソースDLLの名前空間>の部分は、「プロジェクト名」や「DLLの名称」と思いがちですが、これはVisual Studioが生成するデフォルトの名前が同じだからで、正確には名前空間(namespace)になります。
<リソースのクラス名>の部分はリソースDLLで作成したリソースファイルのファイル名と同じ名前で作られた「クラス名」です。
<リソースの名前>はリソースDLLのグリッド表示部で追加した「名前」です(そのままプロパティ名になります)。
※プロパティ名になる関係上、<リソースの名前>に’-‘(ハイフン)は使えません。ご注意ください。

 

実行した結果

起動直後

 

ドロップダウンリストで’English’を選択して[Change]ボタンを押したとき

 

ドロップダウンリストで’日本語’を選択して[Change]ボタンを押したとき

 

ドロップダウンリストで’中文’を選択して[Change]ボタンを押したとき

 

三か国語の文字列リソースを表示できました。

 

タイトルとURLをコピーしました