.NET: コマンドライン引数解析用ライブラリ

C# をはじめとする .NET Framework 上のプログラムで、コマンドライン引数を読みたい場合、以下のいずれかを使えばいい。

  • Main メソッドの引数を見る
  • System.Environment クラスから取得する

で、問題はそれをどう解析するか。Ruby でいうところの OptionParser みたいなライブラリはないものか……と思って探してみた。

NeoticTools.CommandLineParser (GPL)
http://cmdlineparser.sourceforge.net
GotDotNet User Sample: Command Line Parser Library (独自ライセンス)
http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=62a0f27e-274e-4228-ba7f-bc0118ecc41e
The Code Project - Automatic Command Line Parsing in C# (原作者表示)
http://www.codeproject.com/csharp/commandlineparser.asp

括弧内はライセンス。
いずれも基本的な仕組みは同じで、

  1. 引数を格納するためのクラスを作り、コマンドライン引数の値を格納するためのプロパティを定義する
  2. プロパティに属性を付加する
  3. 上記クラスのインスタンスコマンドライン文字列をパーサに渡すと、パーサが解析して各プロパティに値をセットしてくれる

という流れになっているようだ。

ライブラリ別に見てみる

NeoticTools.CommandLineParser はとりあえず GPL なのでライセンス的にはわかりやすいのだが、"-" か "/" で始まっている項目しか取得できないという欠点がある。例えば

mycmd.exe /foo /bar:32 file.txt

と指定された場合、file.txt が取れないのだ。
GotDotNet に載っている Command Line Parser Library は、実は Microsoft の人が書いたもの。機能としてはこれでいいのだけど、ライセンスが独自の "Shared Source License for Command Line Parser Library" となっている。いわゆる "Shared Source License" と違って、商用・非商用のいずれにも利用できる。
最後の Automatic Command Line Parsing in C# は、原則として「クレジット入れてくれれば自由に使っていいよ」という扱いのようだ。元の作者名を明記すること、商用製品に使う場合はバージョン情報にも元の作者名を表示することが必要。また、メールか上記ページのコメント欄で「使ったよ〜」と申告してほしい、と書かれている。

共通した課題

いま気づいたけど、どれも国際化非対応だね。