第8回c#ユーザー会-AppDomain

20
kkamegawa(かめがわ かずし):@kkamegawa [email protected] http://d.hatena.ne.jp/kkamegawa

description

The 8th C# Users group in Japan.Show

Transcript of 第8回c#ユーザー会-AppDomain

Page 1: 第8回c#ユーザー会-AppDomain

kkamegawa(かめがわ かずし):@kkamegawa

[email protected]

http://d.hatena.ne.jp/kkamegawa

Page 2: 第8回c#ユーザー会-AppDomain

かめがわ かずし

某企業でフロントエンドからバックエンドまで手広くいろんなことやってます

最近は@ITでチューニングやらデバッガやら比較的ニッチなところを書いています。http://www.atmarkit.co.jp/fdotnet/chushin/vsperf_index/index.html アプリケーションのギアを上げよう http://www.atmarkit.co.jp/fdotnet/chushin/vsdebug_index/index.html Visual Studioデバッグ手法

Page 3: 第8回c#ユーザー会-AppDomain

知っているようで知らない?

Page 4: 第8回c#ユーザー会-AppDomain

長ったらしく書くとApplication Domain。

マネージプロセスが必ず一つ持ち、多く作れます。

最初の一つ以外いつでも削除できます。

いくつかの例外を除いて、ドメインごとにアセンブリを管理します。

作ったAppDomainを削除すると、ドメイン内で呼び出しているアセンブリも一緒にアンロードされます。

Page 5: 第8回c#ユーザー会-AppDomain

ローダーヒープ

AppDomain #1(既定)

Hoo.exe

Bar1.dll

System.dll

ローダーヒープ

AppDomain #2

Bar1.dll

Bar2.dll

System.dll

ドメイン中立アセンブリ

ローダーヒープ MSCorLib.dll

必要に応じてAppDomainを作成

(普通は既定の一つでいい

名前は自分で考えよう)

MSCorEE.DLL /

MSCorEEi.DLL

(shim)

.NET Framework 4

CLR.DLL

.NET Framework 2.0/3.0/3.5

MSCorWks.DLL

Page 6: 第8回c#ユーザー会-AppDomain

AppDomain.Unload (AppDomain.CurrentDomain); で終わらせようとするとどうなる?

CannotAppDomainUnloadExceptionがスローされる

(ま、普通やりませんよね)

Page 7: 第8回c#ユーザー会-AppDomain

AppDomainってどのくらい作れる?

メモリへのインパクトは?

Page 8: 第8回c#ユーザー会-AppDomain
Page 9: 第8回c#ユーザー会-AppDomain

1000個のAppDomain作成/消去

(ドメイン固有のアセンブリ呼び出しはなし)

作成はあまり時間かからないが、消去は結構かかっている

Loader Heap, Working Set, Private

bytesはAppDomainを消去してもそれなりに。

Loader Heapは適当なところでGCが発生

Page 10: 第8回c#ユーザー会-AppDomain

http://support.microsoft.com/kb/979744/j

a (パッチあり)

.NET Framework 2.0 ベースの Multi-

AppDomain アプリケーションを実行したときにアプリケーションが応答しなくなる

Page 11: 第8回c#ユーザー会-AppDomain
Page 12: 第8回c#ユーザー会-AppDomain

普通やりませんが…

Page 13: 第8回c#ユーザー会-AppDomain

All-In-One-Code-FrameworkにあるCppHostCLRというソリューションがサンプル

http://1code.codeplex.com/

ICorRuntimeHost, ICLRRuntimeHostを使用したサンプル。ただし、どちらもCLR2以降しかロードできない

(今更.NET 1.1のホスティングいらないよね?)

Page 14: 第8回c#ユーザー会-AppDomain
Page 15: 第8回c#ユーザー会-AppDomain

CLRCreateInstance

ICLRMetaHost->GetRuntime()

ICLRRuntimeInfo->IsLoadable()

ICLRRuntimeInfo->GetInferface()

ICorRuntimeHost->Start()

Page 16: 第8回c#ユーザー会-AppDomain

CLRの開始まではそんなに難しくない

アンマネージドからマネージのインスタンスメソッドを呼び出そうとすると結構大変。

staticメソッド呼ぶだけならICLRRuntimeHost->

ExecuteInDefaultAppDomain()でOK

お仕事であるいは趣味で「.NETのこのクラスライブラリ使いたい」と思ったときはどうぞ

Page 17: 第8回c#ユーザー会-AppDomain

Internet Explorer

IIS

IIS6まではWorker ProcessがCLRをホストしていました。

IIS7以降の統合モードではIIS自身がホストします。クラッシックモードではWorker Processが使われます。

SQL Server 2005以降(SQLCLRがある)。

PowerShell

Page 18: 第8回c#ユーザー会-AppDomain

たぶん99.9%の人は複数ドメイン作らなくてもやっていけます。昔はプラグインのために使うこともありましたが、今はMEFがありますし。

そして、CLRのホストは99.999%くらいの人は知らなくてもやっていけるかと思います。

ここもMCPの試験範囲なので出ますよ。

2nd時代にこの本だけ読んでMCP受けました。

Page 19: 第8回c#ユーザー会-AppDomain

プログラミング.NET Framework 第二版

プログラミング.NET Framework 第三版

Root of .NET Framework

MSDN Library(ホストの概要) http://msdn.microsoft.com/ja-jp/library/dd380850.aspx

MSDN Library(アプリケーションドメイン) http://msdn.microsoft.com/ja-jp/library/2bh4z9hs.aspx

Page 20: 第8回c#ユーザー会-AppDomain