ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

アプリケーションドメイン(使い方よく分からず。)

プログラミングC# p480

一気に飛びました。
ADO.NETASP.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)

というわけで、やっぱり意図通りに動かず。うーん。なんか根本的に間違ってるような。
良く分からないので、良く分からないまま放置です。