アプリケーションドメイン(使い方よく分からず。)
プログラミングC# p480
一気に飛びました。
ADO.NETとASP.NETは、.NET開発やるならば別途学習した方がよさそうです。プログラミングC#のカバー範囲は狭すぎて、ほとんど役に立ちません。
さて、アプリケーションドメインですが、
アプリケーションドメインには、フォールトトレランス機能を持たせることができます。つまり2番目のアプリケーションドメインでオブジェクトを生成し、このアプリケーションドメインが何らかの理由でクラッシュしたとしても、停止するのはこのアプリケーションドメインだけであり、プログラム全体が停止することを避けられるのです。
とか説明があり、これを僕は、アプリケーションドメイン1と2があって、2で未捕捉例外が発生しても1は処理続行できると解釈しました。
でもって、こんなサンプルを書いてみる。
using System; namespace AppDomainTest { class AppDomainTest { static void Main(string[] args) { AppDomain ad = AppDomain.CreateDomain("Test Domain"); Test tInAd = (Test)ad.CreateInstanceAndUnwrap("AppDomain Test2", "AppDomainTest.Test"); tInAd.hello(); tInAd.error(); Console.WriteLine("end"); } } class Test : MarshalByRefObject { public void hello() { Console.WriteLine("hello@{0}", AppDomain.CurrentDomain.F riendlyName); } public void error() { throw new Exception("error!@" + AppDomain.CurrentDomain. FriendlyName); } } }
結果はこう。
hello@Test Domain ハンドルされていない例外: System.Exception: error!@Test Domain 場所 AppDomainTest.Test.error() 場所 AppDomainTest.Test.error() 場所 AppDomainTest.AppDomainTest.Main(String[] args)
確かにTest Domainで例外が発生しているのですが、Mainまで例外が伝播し、元のドメインも道連れで死んでます。結果、"end"は出力されません。
なんかイマイチなので、リファレンスになんか載ってねーかなーと思ってみたら、UnhandledExceptionとかそれっぽいの発見。
で、早速それっぽいコードを書いてみる。
using System; namespace AppDomainTest { class AppDomainTest { static void Main(string[] args) { AppDomain ad = AppDomain.CreateDomain("Test Domain"); ad.UnhandledException += delegate(object sender, Unhandl edExceptionEventArgs uhargs){ Console.WriteLine("捕捉されない例外が発生しまし た"); }; Test tInAd = (Test)ad.CreateInstanceAndUnwrap("AppDomain Test", "AppDomainTest.Test"); tInAd.hello(); tInAd.error(); Console.WriteLine("end"); } } class Test : MarshalByRefObject { public void hello() { Console.WriteLine("hello@{0}", AppDomain.CurrentDomain.F riendlyName); } public void error() { throw new Exception("error!@" + AppDomain.CurrentDomain. FriendlyName); } } }
結果はこう。
hello@Test Domain ハンドルされていない例外: System.Exception: error!@Test Domain 場所 AppDomainTest.Test.error() 場所 AppDomainTest.Test.error() 場所 AppDomainTest.AppDomainTest.Main(String[] args)
というわけで、やっぱり意図通りに動かず。うーん。なんか根本的に間違ってるような。
良く分からないので、良く分からないまま放置です。