2005年05月29日

UnhandledException(2)

   このエントリーをはてなブックマークに追加 Clip to Evernote
AppDomain.CurrentDomain.UnhandledExceptionを使うサンプルコードは以下のとおり。

private void button1_Click(object sender, System.EventArgs e) {
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(UnhandledException);

}
private void UnhandledException(object sender, UnhandledExceptionEventArgs e) {
Console.WriteLine("例外が発生" + e.ExceptionObject.ToString());
}

private void button2_Click(object sender, System.EventArgs e) {
Thread th = new Thread(new ThreadStart(MyTask));
th.Start();
}

private void MyTask() {
throw new ApplicationException("スレッドで何らかの例外が発生");
}

先日は、ちょっと使い方が面倒と書きましたが、これだけだと、それほどでもないですね。
そうです。普通に Thread クラスを使って、スレッドを起動した場合は、これで、例外を補足することができます。
でも、非同期デリゲートなんかを使うと、AppDomain.CurrentDomain.UnhandledException はややこしい状態になってしまいます。(続きま、また今度)
  

Posted by gushwell at 22:18Comments(0)TrackBack(0)

2005年05月28日

Generic Host Process for Win32 Services

   このエントリーをはてなブックマークに追加 Clip to Evernote
修正ソフトをダウンロードしてみました。今のところ現象は出ていません。といっても、今までも、毎回現象がでるわけではなかったので、本当に直ったのかどうか分りません。
あと数日は使わないと結論は出せませんが、なんとなくOKそうです。
これでエラーから開放されると思うと、うれしいですね。  
Posted by gushwell at 00:09Comments(0)TrackBack(0)

2005年05月25日

UnhandledException

   このエントリーをはてなブックマークに追加 Clip to Evernote
Application.ThreadException イベントに例外ハンドラを登録すると、未補足例外をすべて、捕まえることができます。
つまり、すべての場所で、try-cacth を書かなくても済むということです。

using System.Threading;

private void Foo() {
Application.ThreadException +=
new ThreadExceptionEventHandler(AppThreadException);
}

private void AppThreadException(object sender,
ThreadExceptionEventArgs e) {
MessageBox.Show("例外が発生" + e.Exception.Message);
}

とすれば、補足されなかった、例外が、すべて AppThreadExceptionメソッドで処理できます。

ただ、一つ問題があります。それは、UIスレッド上の未補足例外しか対象になっていないという点です。

もし、自分で作成したスレッド上で発生した例外も補足したいのならば、Application.ThreadException は使えません。

この場合は、AppDomain.CurrentDomain.UnhandledException を使うことになります。ただ、これって、ちょっと使い方が面倒ですね。
続きは、また今度。  
Posted by gushwell at 22:31Comments(0)TrackBack(0)

2005年05月24日

Generic Host Process for Win32 Services

   このエントリーをはてなブックマークに追加 Clip to Evernote
[FIX] セキュリティ更新プログラム MS05-012 をインストール後、リッチ テキスト形式の電子メール メッセージで 2 バイト文字セットの添付ファイル名が表示されず、エラー メッセージ "Generic Host Process" が表示されることがあるというページから修正プログラムがダウンロードできるようです。
さっそく、ダウンロードしてみます。でも、現象が違うので直るかどうかまだ分りません。

ちなみに、googleから僕のページにアクセスする人の多くは、「Generic Host Process」というキーワードで検索してきた人が多いようです。それだけ、このエラーで困っている人が多いということかな。  
Posted by gushwell at 20:37Comments(0)TrackBack(1)

2005年05月20日

TestDriven.NET

   このエントリーをはてなブックマークに追加 Clip to Evernote
TestDriven.NET をインストール。
NUnit Addin をダウンロードしようと、Webで探し回っていたら、TestDriven.NET にたどり着きました。正式名称が「TestDriven.NET」になったということかな。
こちらの期待していたものとはちょっと違っていましたが、IDE上でテストを走らせることができるので、便利ですね。赤とか緑とかの色が出ないので、ちょっと雰囲気が出ないですが...
便利なのは、NUnit とは違い、プロジェクトのプロパティで、exe と コマンドラインの指定をしなくても動作させることができることです。
また、エラーのあった、テストコードにもすぐに飛んでいけるのも良いですね。
  
Posted by gushwell at 20:57Comments(0)TrackBack(0)

2005年05月19日

RSSバー

   このエントリーをはてなブックマークに追加 Clip to Evernote
Goo RSSリーダーV2にバージョンアップしたら、RSSサイトの登録が出来なくなってしまい、しかたなくGoo RSSリーダーからRSSバーに乗り換えました。
動作も軽快だし、なかなか、使い勝手も良いですね。なんといっても、IEだけ起動しておけば良いのがとても便利です  
Posted by gushwell at 09:11Comments(0)TrackBack(0)

2005年05月18日

NUnit

   このエントリーをはてなブックマークに追加 Clip to Evernote
NUnit Ver2 利用ガイド[PDF]を参考にNUnitをダウンロードして動かしてみる。「えっ、今まで NUnit動かしたこと無いの?」と言われそうですが、実は、NUnitは今日までさわったこがありませんでした。
DUnitというDelphi用のUnitTestツールは使ったことがあったのですが、.NETになってからは、小さなプログラムしか作る機会がないので、その必要性を感じなかったのです。
NUnitをさわってみた感想ですが、.NETだけあって、属性を使うのが特徴的ですが、あとは、他のUnitTestツールとほとんどかわりませんね。
不満と言えば、テストプロジェクトを作るのがちょっと面倒というとこでしょうか。やはりIDEと統合されていると良いのに、と思います。IDEにアドインできるツールも有るらしいのであとで試してみようと思います。
それと、先駆者の方が、日本語で資料を公開してくれているので、とても助かります。  
Posted by gushwell at 18:07Comments(0)TrackBack(0)

2005年05月17日

ProxyAttribute

   このエントリーをはてなブックマークに追加 Clip to Evernote
ProxyAttribute を使うと、コンストラクタをトラップすることができます。
以下のソース(.NET Framework のヘルプのコードとほとんど同じものですが)を見て下さい。

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Contexts;

class Class {
[STAThread]
static void Main(string[] args) {
CustomServer cs = new CustomServer();
cs.Print("Hello");
Console.ReadLine();
}
}

[AttributeUsage(AttributeTargets.Class)]
public class MyProxyAttribute : ProxyAttribute {
public MyProxyAttribute() : base(){
}
public override MarshalByRefObject CreateInstance(Type serverType) {
Console.WriteLine("CreateInstance:" + serverType.FullName);
return base.CreateInstance(serverType);
}
}

[MyProxyAttribute]
public class CustomServer :ContextBoundObject {
public CustomServer() {
Console.WriteLine("Constructor called");
}
public void Print(string str) {
Console.WriteLine("Print Method: " + str);
}
}


ProxyAttributeから独自のクラスを派生させ、CreateInstanceをoverrideします。
この派生した属性クラスを付加した、クラス(ここではCustomServer)のインスタンスを new すると、CustomServerのコンストラクタが動く前に、先ほどの CreateInstanceが起動されます。
このコードでは、RemoteProxyを使っていませんが、前回のコードと組み合わせ、ここで、透過プロキシーを返すようにしてあげれば、クライアント(ここでは、Mainメソッド)側は、Proxyを生成していることを意識することなく、プロキシーを使うことができます。

ContextBoundObjectからCustomerクラスを派生させないといけないという制約はありますが、とても興味深い機能ですね。
  
Posted by gushwell at 21:08Comments(0)TrackBack(0)