Windows .NET標準付属のcscだけでリソース(resxやresources)を含むアプリの開発を行う方法です。
Windows SDKに含まれるresgen
も必要ないため、何もインストールしていないピュアなWindows環境でも十分です。
実際にはresgenやVisual Studioのツールを使ったほうが便利なケースのほうが多いと思います。 このドキュメントはあくまでピュアなWindows環境でcscだけを使い、どこまで作れるのかという興味本位の実験です。 現実的ではありませんが、VSやSDKなどなにもインストールできないような環境や、 既存の環境のままでちょっとしたものを作りたいという場面ではなにかの役に立つかもしれません。
Microsoft .NET (mscorlibまたはForms)には、ResXResourceWriter
とResourceWriter
が含まれており、
これらを利用すればresgenなどを使わずともresxやresourceファイルをコードから生成することができます。
以下はResXResourceWriterを使うコードの例です。 ハードコーディングしていますが、実際にはコマンドライン引数などからうまく動くものにすると便利と思います。 あるいはPowerShellで組んでしまうのも手かもしれません。
// ResXGen.cs
using System;
using System.Resources;
class ResXGen {
static void Main() {
using (var resx = new ResXResourceWriter("test.resx")) {
resx.AddResource("key1", "value1");
resx.AddResource("key2", "value2");
resx.AddResource("key3", "value3");
// ...
}
}
}
このようなコードを、cscでコンパイルし、実行します。
csc ResXGen.cs
ここでコンパイルされたResXGen.exeを実行すれば、resxを生成することができます。 生成されたtest.resxを開くと次のようにデーターが書き込まれていることが分かります。
<data name="key1" xml:space="preserve">
<value>value1</value>
</data>
<data name="key2" xml:space="preserve">
<value>value2</value>
</data>
<data name="key3" xml:space="preserve">
<value>value3</value>
</data>
最後に、生成されたresxとcscの/resオプションに受け渡し、 アプリのソースコードと一緒にコンパイルするだけです。
csc YourResXApp.cs /res:test.resx
上記ではResXWriterを使いresxを作成しましたが、ResourceWriterでresourcesを作る場合も手順は同じです。
なお、ResourceWriterやResXWriterは、resoucesやresxを完全に新規に作成します。 コンストラクタに既存のリソースファイル指定して、AddResouceしても、 追記にはならず、新規作成されたリソースファイルで上書きになってしまうため注意してください。
おそらく追記したい場合は、いったんReaderなどですべて読み取ったうえで、Writerに書き込む必要があるのだと思われます。(未検証です)
resgen(/str と /publicClass オプション)を使えば簡単に利用できる自動生成コードが得られますが、 cscだけで実現する場合はリソースを利用するコードも手作業で記述する必要があります。
リソースを利用については次のクラスを参照ください。
以下は簡単なものですが埋め込んだresxからデーターを取得する例です。
using System;
using System.Resources;
// YourResXApp.cs
class YourResXApp {
static void Main(){
var a = typeof(YourResXApp).Assembly;
using (var s = a.GetManifestResourceStream("test.resx"))
using (var r = new ResXResourceSet(s)) {
Console.WriteLine(r.GetString("key1"));
}
}
}
次は埋め込んだresourcesからデーターを取得する例です。 ResourceManagerコンストラクタのドキュメントにも記載がありますが、拡張子.resourcesが必要ない点は注意してください。
using System;
using System.Resources;
// YourResourcesApp.cs
class YourResourcesApp {
static void Main(){
var a = typeof(YourResourcesApp).Assembly;
var r = new ResourceManager("test", a);
Console.WriteLine(r.GetString("key1"));
}
}
もちろん、ResourceManagerやResXResourceSetを使えば埋め込みリソースでなくとも、 外部のアセンブリや、外部の単体リソースファイルから読み取ることもできます。