Skip to content

Instantly share code, notes, and snippets.

@retorillo
Created December 1, 2015 14:34
Show Gist options
  • Save retorillo/f6e2f35944cd6e2dbc52 to your computer and use it in GitHub Desktop.
Save retorillo/f6e2f35944cd6e2dbc52 to your computer and use it in GitHub Desktop.
cscだけでresxやresourcesを使用するアプリを組む方法 (VisualStudioやresgenを使わない)

cscだけでresxやresourcesを使用するアプリを組む方法 (VisualStudioやresgenを使わない)

Windows .NET標準付属のcscだけでリソース(resxやresources)を含むアプリの開発を行う方法です。 Windows SDKに含まれるresgenも必要ないため、何もインストールしていないピュアなWindows環境でも十分です。

このドキュメントは実践的ではありません

実際にはresgenやVisual Studioのツールを使ったほうが便利なケースのほうが多いと思います。 このドキュメントはあくまでピュアなWindows環境でcscだけを使い、どこまで作れるのかという興味本位の実験です。 現実的ではありませんが、VSやSDKなどなにもインストールできないような環境や、 既存の環境のままでちょっとしたものを作りたいという場面ではなにかの役に立つかもしれません。

リソースを作る・埋め込む

Microsoft .NET (mscorlibまたはForms)には、ResXResourceWriterResourceWriterが含まれており、 これらを利用すれば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を使えば埋め込みリソースでなくとも、 外部のアセンブリや、外部の単体リソースファイルから読み取ることもできます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment