2007年03月28日

Encoding.GetEncoding("shift-jis")

System.Text.Encoding.GetEncoding("shift_jis")

System.Text.Encoding.GetEncoding("shift-jis")
の違い

結果的には、この2つの呼び出しはまったく同じになるのですが、
前者の "shift_jis" は、IANAが定めるCharacter Set の名前で、後者の "shift-jis" は、そのAlias ということです。

レジストリの

HKEY_CLASSES_ROOT\MIME\Database\Charset

を覗いてみると、"shift-jis" から "shift_jis" が求められるのがわかります。

なお、IANAが定めている Aliasには、"MS_Kanji", "csShiftJIS" もあり、これらの名前も、GetEncodingの引数として利用できます。
  

Posted by gushwell at 22:58Comments(2)TrackBack(0)

2007年03月20日

Visual Studio Team Syste の単体テストで例外発生をテストする方法

備忘:Visual Studio Team Syste の単体テストの例外発生をテストする方法

ExpectedExceptionAttribute をメソッドに付加することで、予測される例外がスローされるかどうかをテストできます。

わざわざ、例外をキャッチするコードを書く必要はありません。

 // InvalidOperationExceptionが発生すればテストOK
[TestMethod()]
[ExpectedException(typeof(InvalidOperationException))]
public void TestMethod() {
// この中で、InvalidOperationException 例外が発生することを確認
}


  
Posted by gushwell at 23:26Comments(0)TrackBack(0)

2007年03月19日

EBCDIC用の Encoding

ASCIIコードをEBCDICコードに変換する必要があり、.NET Framework の Encodingクラスを調べていたら、なんだ、ちゃんと EBCDIC用の Encoder が用意されているではないですか。
良かった。

と思ったのはつかの間、IBM500, IBM037, IBM290 などたくさんのEncodingがあって、どれを使えばよいかわかりません。ためしに、以下のように、IBM500 と IBM290 を使ってみました。

byte[] buf = Encoding.GetEncoding("IBM290").GetBytes(str);

結果を比較したら、やっぱり値が違ってました。

IBM290は、「IBM EBCDIC (日本語カタカナ) 用」とのことですが、通常の EBCDIC の $ に位置に、\ が定義されてるみたい。
そのほか、~ コードも位置がずれています。$ と \ は、ある意味、とても論理的だと思うのですが、実際には、$は$と変換してほしいので、この変換は使えませんね。

うーーん、英数記号については、EBCDICは、共通だと思っていましたが、違うんですね。やはり、対象となる EBCDICが何なのかを調べるのが先みたいです。
  
Posted by gushwell at 22:43Comments(0)TrackBack(0)

2007年03月15日

C#のジェネリックメソッドの型推論


 public T Foo<T>(int n) where T: new() {
T x = new T();
...
return x;
}

みたいなメソッドをC#で書いたら、FxCopで、

警告 1 CA1004 : Microsoft.Design : MyClass.Foo(Int32):T が、それへの呼び出し内で、明示的な型パラメータを必要としないデザインを考慮してください。

という警告が出た。ヘルプを読むと、引数にも T を入れろということらしい。

これは、どういうことかというと、
 public void Moge(T x, int n) {
...

}

というように、引数にも T がある場合、呼び出す際に、

obj.Moge<Sample>(sample, 5);


のように書く必要はなく、コンパイラが型推論を行ってくれるので、

obj.Moge(sample, 5);


のように、型パラメータを省略することができるということ。

でも、今回の僕のコードは、そもそも、引数には、T のインスタンスは不要なんだから、引数に T を入れるのは、ナンセンス。
ただ、この書き方は、推奨されないんだから、どうしようかなと考えたが、何のことはない、

 class MyClass<T> where T : new() {
..
public T Foo(int n) where T: new() {
T x = new T();
...
return x;
}
}


と、ジェネリッククラスにすれば良いだけだった。orz
このクラスには、ほかにもジェネリックメソッドがあったので、はじめから、ジェネリッククラスにすべきものだった。
FxCopは、設計上の見落としにも気が付くので、とても重宝している。  
Posted by gushwell at 23:33Comments(0)TrackBack(1)

2007年03月14日

Orcasでコードメトリックス

The Visual Studio Code Analysis Team Blogの記事 Announcing Visual Studio Code Metrics!によれば、次期 Visual Studio Team System (Orcas)には、コードメトリックスの機能が付くらしい。

メトリックスの種類としては、Maintainability Index, Cyclomatic Complexity, Depth of Inheritance, Class Coupling , Lines of Code が計測できるようだ。

待ち遠しいですね。  
Posted by gushwell at 23:25Comments(0)TrackBack(0)

2007年03月13日

Enterprise Librry:Configuration ツールにアセンブリを認識させる

Enterprise Libraryに独自のApplication Blockを追加する場合、Enterprise Library Configuration ツールに、自作のDLLを認識させる必要がある。

C#の場合、AssemblyInfo.cs に以下の記述が必要。

[assembly: ConfigurationDesignManager(typeof(PrelimHandlingConfigurationDesignManager))]

これをやらずに、なぜEnterprise Library Configuration ツールにメニュー項目が追加されないのか分からずに悩んだ。


構成ファイルから、さまざまな設定情報を読み込み、その設定内容によって動作が変わるフレームワークを作成する場合、この Enterprise Library の Configuration ツールで、構成情報を設定できるようになれば楽だな、と思って調査を開始したのだが、分からないことだらけで、かなり時間を費やしてしまった。

Application Block の形式にするのは、なかなか骨の折れる作業が必要だけれど、それなりのメリットは得られると思う。

  
Posted by gushwell at 23:29Comments(0)TrackBack(0)

2007年03月07日

Enterprise Library: カスタムトレースリスナー

Enterprise Library のカスタムTraceListener をC#で、作成しようとしたのだが、残念ながら日本語のサイトでは見つけることができなかった。

googleで検索し、CodeGuru のサイトに、
Enterprise Library 2.0: The Logging Application Block

という記事があるのを見つける。うれしいことに、C#のサンプルコードもダウンロードできるようになっている。

なるほど、.NET Framework の TraceListenerあるいはその派生クラスを元に、クラスを定義し、属性
[ConfigurationElementType(typeof(CustomTraceListenerData))]

を付加すれば良いだけか。

もっとも簡単なのが、CustomTraceListenerから派生させる方法。

このとき、
void TraceData(TraceEventCache eventCache, string source, 
TraceEventType eventType, int id, object data)

をoverrideするのだが、最後の引数 object には、LogEntry のインスタンスが渡ってくるので、この情報を元に、ログ出力する処理を書けばよいことになる。

TraceDataメソッド内で、

string text = this.Formatter.Format(data as LogEntry);

とすれば、構成ファイルで指定した、Formatter が呼び出される仕組みに
なっている。

string text = (data as LogEntry).ToString();

とした場合は、TextFormatter の Formatメソッドが呼ばれることになる。

構成ファイルに付加的な情報をセットしておいて、TraceListener内で、それを利用することも可能なようだ。

ここまでわかれば、EnterpriseLibraryの該当するソースそのものを読むのもそれほど大変なことではないかな。
  
Posted by gushwell at 22:02Comments(0)TrackBack(0)

2007年03月05日

Enterprise Library: Logging Application Block

Enterprise Library Logging Application Block を使ってみる。

C#で、ログ出力するには、以下のように書けばよい。

LogEntry log = new LogEntry();
log.Message = "エラーが発生したよ";
log.Severity = System.Diagnostics.TraceEventType.Error;
Logger.Write(log);

で、実際に、どこにこのログが出力されるかは、構成ファイルで設定することになる。
ここまでは、Webで調べてすぐにわかったのだが、Severity プロパティに設定した値によって、イベントログに吐き出したり、テキストログに吐き出したり切り分ける方法が、わからず悩んでしまった。

試行錯誤の結果、次のようにすればできることを確認。

例えば、
・Error 以上ならば、イベントログへ
・すべての情報を テキストファイルへ、
出力したい場合は、構成設定を以下のように設定すればよい。

Category Sources
General (SourceLevels : Error)
EventLog TraceListenerを設定する
Special Sources
All Events (SourceLevels : All)
FlatFile TraceListener を設定する。




  
Posted by gushwell at 21:45Comments(0)TrackBack(0)