Note
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãµã€ã³ã€ã³ãŸãã¯ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
次ã®ä¿¡é Œæ§èŠå㯠SQL Server åãã§ãããã ãããã¹ã ããŒã¹ã®ãµãŒã㌠ã¢ããªã±ãŒã·ã§ã³ã«ãé©çšãããŸãã SQL Server ãªã©ã®ãµãŒããŒããªãœãŒã¹ããªãŒã¯ããã忢ããªãããšãéåžžã«éèŠã§ãã ãã ããããã¯ããªããžã§ã¯ãã®ç¶æ ã倿Žãããã¹ãŠã®ã¡ãœããã®ããã¯ã¢ãŠã ã³ãŒããèšè¿°ããããšã«ãã£ãŠè¡ãããšã¯ã§ããŸããã ç®æšã¯ããã¹ãŠã®å Žæã®ãšã©ãŒããå埩ããããã«ããã¯ã¢ãŠãã³ãŒããåãã100%ä¿¡é Œæ§ã®é«ããããŒãžãã³ãŒããæžãããšã§ã¯ãããŸããã ããã¯æåã®å¯èœæ§ãã»ãšãã©ãªãå°é£ãªäœæ¥ã§ãã å ±éèšèªã©ã³ã¿ã€ã (CLR) ã¯ãå®å šãªã³ãŒãã®èšè¿°ãå¯èœã«ããããã«ããããŒãžã ã³ãŒãã«ååãªåŒ·åãªä¿èšŒãç°¡åã«æäŸããããšã¯ã§ããŸããã ASP.NET ãšã¯ç°ãªããSQL Server ã§ã¯ãããŒã¿ããŒã¹ãé·æé忢ããªããšãªãµã€ã¯ã«ã§ããªãããã»ã¹ã 1 ã€ã ã䜿çšãããããšã«æ³šæããŠãã ããã
ãããã®åŒ±ãä¿èšŒãšåäžããã»ã¹ã§ã®å®è¡ã«ãããä¿¡é Œæ§ã¯ãå¿ èŠã«å¿ããŠã¹ã¬ããã®çµäºãŸãã¯ã¢ããªã±ãŒã·ã§ã³ ãã¡ã€ã³ã®ãªãµã€ã¯ã«ã«åºã¥ããŠããããã³ãã«ãã¡ã¢ãªãªã©ã®ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãªãœãŒã¹ããªãŒã¯ããªãããã«äºé²æªçœ®ãè¬ããå¿ èŠããããŸãã ãã®ããåçŽãªä¿¡é Œæ§å¶çŽã䜿çšããŠããä¿¡é Œæ§ã«é¢ããéèŠãªèŠä»¶ãåŒãç¶ãååšããŸãã
ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã®ãªãœãŒã¹ããªãŒã¯ããŸããã
CLR ã«å¯Ÿãããã¹ãŠã®ãã©ãŒã ã«ãããŠãã¹ãŠã®ãããŒãžã ããã¯ãèå¥ããããšã
ã¢ããªã±ãŒã·ã§ã³ãã¡ã€ã³éã®å ±æç¶æ ãäžæããªãã§ãã ãããããã«ããã AppDomain ãªãµã€ã¯ã«ãã¹ã ãŒãºã«æ©èœããŸãã
çè«çã«ã¯ã ThreadAbortExceptionã StackOverflowExceptionãããã³ OutOfMemoryException ã®äŸå€ãåŠçãããããŒãžã ã³ãŒããèšè¿°ããããšã¯å¯èœã§ãããéçºè ãã¢ããªã±ãŒã·ã§ã³å šäœã§ãã®ãããªå ç¢ãªã³ãŒããèšè¿°ããããšã¯çã«éé¶ã§ããŸããã ãã®ããã垯åå€äŸå€ã«ãããå®è¡äžã®ã¹ã¬ãããçµäºããŸããçµäºããã¹ã¬ãããå ±æç¶æ ãç·šéããŠããå Žå(ã¹ã¬ãããããã¯ãä¿æããŠãããã©ããã«ãã£ãŠå€æã§ãã)ã AppDomain ã¯ã¢ã³ããŒããããŸãã å ±æç¶æ ãç·šéããŠããã¡ãœãããçµäºãããšãå ±æç¶æ ã«æŽæ°ããããã®ä¿¡é Œæ§ã®é«ãããã¯ã¢ãŠã ã³ãŒããèšè¿°ã§ããªããããç¶æ ãç ŽæããŸãã
.NET Framework ããŒãžã§ã³ 2.0 ã§ã¯ãä¿¡é Œæ§ãå¿ èŠãšããå¯äžã®ãã¹ã㯠SQL Server ã§ãã ã¢ã»ã³ããªã SQL Server ã§å®è¡ãããå Žåã¯ãããŒã¿ããŒã¹ã§å®è¡ãããšãã«ç¡å¹ã«ãªã£ãŠããç¹å®ã®æ©èœãããå Žåã§ãããã®ã¢ã»ã³ããªã®ãã¹ãŠã®éšåã«å¯ŸããŠä¿¡é Œæ§ã®äœæ¥ãè¡ãå¿ èŠããããŸãã ããã¯ãã³ãŒãåæãšã³ãžã³ãã¢ã»ã³ã㪠ã¬ãã«ã§ã³ãŒãã調ã¹ãç¡å¹ãªã³ãŒããåºå¥ã§ããªãããã«å¿ èŠã§ãã ãã 1 ã€ã® SQL Server ããã°ã©ãã³ã°äžã®èæ ®äºé ã¯ãSQL Server ã 1 ã€ã®ããã»ã¹ã§ãã¹ãŠãå®è¡ããã¡ã¢ãªããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãã³ãã«ãªã©ã®ãã¹ãŠã®ãªãœãŒã¹ãã¯ãªãŒã³ã¢ããããããã« AppDomain ãªãµã€ã¯ã«ã䜿çšããããšããããšã§ãã
ããã¯ã¢ãŠã ã³ãŒãã®ãã¡ã€ãã©ã€ã¶ãŒãŸãã¯ãã¹ãã©ã¯ã¿ãŒãŸã㯠try/finally ãããã¯ã«äŸåããããšã¯ã§ããŸããã äžæããããåŒã³åºãããªãã£ããããå¯èœæ§ããããŸãã
ThreadAbortExceptionãStackOverflowExceptionãOutOfMemoryException ãªã©ã®éåæäŸå€ããäºæããªãå Žæ (ãã¹ãŠã®ãã·ã³åœä»€) ã§ã¹ããŒãããå¯èœæ§ããããŸãã
ãããŒãžã ã¹ã¬ããã¯ãå¿ ããã SQL ã® Win32 ã¹ã¬ããã§ãããšã¯éããŸãããç¹ç¶ã§ããå¯èœæ§ããããŸãã
ããã»ã¹å šäœãŸãã¯ã¢ããªã±ãŒã·ã§ã³éã®ãã¡ã€ã³å€æŽå¯èœãªå ±æç¶æ ã¯ãå®å šã«å€æŽããããšã¯éåžžã«å°é£ã§ãããå¯èœãªéãé¿ããå¿ èŠããããŸãã
SQL Server ã§ã¯ãã¡ã¢ãªäžè¶³ã®ç¶æ ã¯ãŸãã§ã¯ãããŸããã
SQL Server ã§ãã¹ããããŠããã©ã€ãã©ãªãå ±æç¶æ ãæ£ããæŽæ°ããªãå ŽåãããŒã¿ããŒã¹ãåèµ·åããããŸã§ã³ãŒããå埩ããªãå¯èœæ§ãé«ããªããŸãã ããã«ã極端ãªå Žåã«ã¯ãSQL Server ããã»ã¹ã倱æããããŒã¿ããŒã¹ãåèµ·åããå¯èœæ§ããããŸãã ããŒã¿ããŒã¹ãåèµ·åãããšãWeb ãµã€ãã忢ããããäŒç€Ÿã®éçšã«åœ±é¿ãäžãããããŠãå¯çšæ§ãæãªãããå¯èœæ§ããããŸãã ã¡ã¢ãªããã³ãã«ãªã©ã®ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãªãœãŒã¹ã®ãªãŒã¯ãé ããšããµãŒããŒãæçµçã«åŸ©æ§ã®å¯èœæ§ãªããã³ãã«ã®å²ãåœãŠã«å€±æãããããµãŒããŒã®ããã©ãŒãã³ã¹ãäœäžããã客æ§ã®ã¢ããªã±ãŒã·ã§ã³ã®å¯çšæ§ãäœäžãããããå¯èœæ§ããããŸãã æããã«ããããã®ã·ããªãªãåé¿ããããšèããŠããŸãã
ãã¹ã ãã©ã¯ãã£ã¹ ã«ãŒã«
ãã®æŠèŠã§ã¯ããã¬ãŒã ã¯ãŒã¯ã®å®å®æ§ãšä¿¡é Œæ§ãåäžãããããã«ããµãŒããŒã§å®è¡ããããããŒãžã ã³ãŒãã®ã³ãŒã ã¬ãã¥ãŒã§ãã£ããããå¿ èŠãããå 容ã«éç¹ã眮ããŠèª¬æããŸããã ãããã®ãã§ãã¯ã¯ãã¹ãŠäžè¬çã«è¯ãç¿æ £ã§ããããµãŒããŒäžã§çµ¶å¯Ÿã«è¡ãå¿ èŠããããŸãã
ããã ããã¯ãŸãã¯ãªãœãŒã¹å¶çŽãçºçããå ŽåãSQL Server ã¯ã¹ã¬ãããäžæ¢ãããã AppDomainãç Žæ£ããŸãã ãã®å Žåãå¶çŽä»ãå®è¡ãªãŒãžã§ã³ (CER) å ã®ããã¯ã¢ãŠã ã³ãŒãã®ã¿ãå®è¡ãããŠããããšãä¿èšŒãããŸãã
SafeHandle ã䜿çšããŠãªãœãŒã¹ ãªãŒã¯ãåé¿ãã
AppDomainã¢ã³ããŒãã®å Žåã¯ãfinally ãããã¯ãŸãã¯ãã¡ã€ãã©ã€ã¶ãŒãå®è¡ãããããšã«äŸåã§ããªããããSafeHandleãIntPtrããŸãã¯åæ§ã®ã¯ã©ã¹ã§ã¯ãªããHandleRef ã¯ã©ã¹ãä»ããŠãã¹ãŠã®ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãªãœãŒã¹ ã¢ã¯ã»ã¹ãæœè±¡åããããšãéèŠã§ãã ããã«ãããAppDomain ãç Žæ£ãããŠããCLR ã¯äœ¿ããããã³ãã«ã远跡ããŠéããããšãã§ããŸãã
SafeHandle ã¯ãCLR ãåžžã«å®è¡ããéèŠãªãã¡ã€ãã©ã€ã¶ãŒã䜿çšããŸãã
ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãã³ãã«ã¯ãäœæãããæç¹ããè§£æŸãããæç¹ãŸã§ã®ã»ãŒã ãã³ãã«ã«æ ŒçŽãããŸãã
ThreadAbortException ãçºçããŠãã³ãã«ããªãŒã¯ããå¯èœæ§ã®ããæéç¯å²ã¯ãããŸããã ããã«ããã©ãããã©ãŒã åŒã³åºãã¯ãã³ãã«ãåç
§ã«ãŠã³ãããŸããããã«ããããã³ãã«ã®æå¹æéãå³å¯ã«è¿œè·¡ã§ããããã Dispose ãšçŸåšãã³ãã«ã䜿çšããŠããã¡ãœããã®éã®ç«¶åç¶æ
ã«é¢ããã»ãã¥ãªãã£ã®åé¡ãåé¿ãããŸãã
çŸåšããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãã³ãã«ãã¯ãªãŒã³ã¢ãããããã¡ã€ãã©ã€ã¶ãŒãããã»ãšãã©ã®ã¯ã©ã¹ã§ã¯ããã¡ã€ãã©ã€ã¶ãŒã¯äžèŠã«ãªããŸãã 代ããã«ããã¡ã€ãã©ã€ã¶ãŒã¯ SafeHandle 掟çã¯ã©ã¹äžã«ãããŸãã
SafeHandleã¯IDisposable.Disposeã®ä»£ããã§ã¯ãªãããšã«æ³šæããŠãã ããã ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãªãœãŒã¹ãæç€ºçã«ç Žæ£ããå ŽåããªãœãŒã¹ã®ç«¶åãšããã©ãŒãã³ã¹ã®å©ç¹ãåŒãç¶ãçºçããå¯èœæ§ããããŸãã ãªãœãŒã¹ãæç€ºçã«ç Žæ£ãã finally ãããã¯ãå®äºãŸã§å®è¡ãããªãå¯èœæ§ãããããšãèªèããã ãã§ãã
SafeHandle ã䜿çšãããšããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãã³ãã«ã®è§£æŸã«ãŒãã³ãžã®ç¶æ
ã®æž¡ããã«ãŒãå
ã®ãã³ãã«ã®ã»ããã®è§£æŸãªã©ããã³ãã«ãè§£æŸããåŠçãå®è¡ããç¬èªã® ReleaseHandle ã¡ãœãããå®è£
ã§ããŸãã CLR ã§ã¯ããã®ã¡ãœãããå®è¡ãããŠããããšãä¿èšŒãããŸãã ãã³ãã«ããã¹ãŠã®ç¶æ³ã§ç¢ºå®ã«è§£æŸãããããã«ããã®ã¯ã ReleaseHandle å®è£
ã®äœæè
ã®è²¬ä»»ã§ãã ãããè¡ããªããšãã³ãã«ããªãŒã¯ããããã³ãã«ã«é¢é£ä»ããããŠãããã€ãã£ã ãªãœãŒã¹ãæŒããããããšããããããŸãã ãããã£ãŠãSafeHandleå®è£
ã§åŒã³åºãæã«äœ¿çšã§ããªããªãœãŒã¹ãå²ãåœãŠãå¿
èŠããªãããã«ã掟çã¯ã©ã¹ReleaseHandleæ§é ããããšãéèŠã§ãã ã³ãŒãã§ãã®ãããªãšã©ãŒãåŠçããã³ã³ãã©ã¯ããå®äºããŠãã€ãã£ã ãã³ãã«ãè§£æŸã§ããå Žåã¯ã ReleaseHandle ã®å®è£
å
ã§å€±æããå¯èœæ§ãããã¡ãœãããåŒã³åºãããšãã§ããŸãã ãããã°ã®ç®çã§ã ReleaseHandle ã«ã¯ Boolean æ»ãå€ããããŸãããã®æ»ãå€ã¯ããªãœãŒã¹ã®è§£æŸã劚ããèŽåœçãªãšã©ãŒãçºçããå Žåã« false ã«èšå®ãããå¯èœæ§ããããŸãã ããã«ãããåé¡ã®ç¹å®ã«åœ¹ç«ã€ releaseHandleFailed MDA (æå¹ãªå Žå) ãã¢ã¯ãã£ãã«ãªããŸãã ä»ã®æ¹æ³ã§ã¯ã©ã³ã¿ã€ã ã«ã¯åœ±é¿ããŸããã ReleaseHandle ã¯åããªãœãŒã¹ã«å¯ŸããŠå床åŒã³åºãããªãããããã³ãã«ããªãŒã¯ãããŸãã
SafeHandle ã¯ãç¹å®ã®ã³ã³ããã¹ãã§ã¯é©åã§ã¯ãããŸããã ReleaseHandle ã¡ãœããã¯GCãã¡ã€ãã©ã€ã¶ãŒ ã¹ã¬ããã§å®è¡ã§ãããããç¹å®ã®ã¹ã¬ããã§è§£æŸããå¿ èŠããããã³ãã«ã¯ãSafeHandleã§ã©ããããªãã§ãã ããã
ã©ã³ã¿ã€ã åŒã³åºãå¯èœã©ãã㌠(RCW) ã¯ã远å ã³ãŒããªãã§ CLR ã«ãã£ãŠã¯ãªãŒã³ã¢ããã§ããŸãã ãã©ãããã©ãŒã åŒã³åºãã䜿çšããCOM ãªããžã§ã¯ãã IUnknown* ãŸã㯠IntPtrãšããŠæ±ãã³ãŒãã®å Žåã¯ãRCW ã䜿çšããããã«ã³ãŒããæžãçŽãå¿
èŠããããŸãã
SafeHandle ã¢ã³ãããŒãžã ãªãªãŒã¹ ã¡ãœããããããŒãžã ã³ãŒãã«åŒã³åºãããå¯èœæ§ãããããããã®ã·ããªãªã«ã¯é©ããŠããªãå¯èœæ§ããããŸãã
ã³ãŒãåæã«ãŒã«
ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãªãœãŒã¹ãã«ãã»ã«åããã«ã¯ã SafeHandle ã䜿çšããŸãã HandleRefãŸãã¯IntPtråã®ãã£ãŒã«ãã¯äœ¿çšããªãã§ãã ããã
ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãªãœãŒã¹ã®ãªãŒã¯ãé²ãããã«ãã¡ã€ãã©ã€ã¶ãŒãå®è¡ããå¿ èŠããªãããšã確èªãã
ãã¡ã€ãã©ã€ã¶ãŒãæ éã«ç¢ºèªããŠãå®è¡ãããŠããªãå Žåã§ããéèŠãªãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãªãœãŒã¹ããªãŒã¯ãããŠããªãããšã確èªããŸãã ã¢ããªã±ãŒã·ã§ã³ãå®å®ããç¶æ ã§å®è¡ãããŠããå Žåã SQL Server ãªã©ã®ãµãŒããŒãã·ã£ããããŠã³ããå Žåãéåžžã® AppDomain ã¢ã³ããŒããšã¯ç°ãªããçªç¶ã® AppDomain ã¢ã³ããŒãäžã«ãªããžã§ã¯ãã¯çµäºããŸããã ã¢ããªã±ãŒã·ã§ã³ã®æ£ç¢ºæ§ãä¿èšŒããããšã¯ã§ããŸãããããªãœãŒã¹ããªãŒã¯ããªãããšã«ãã£ãŠãµãŒããŒã®æŽåæ§ãç¶æããå¿ èŠããããããçªç¶ã¢ã³ããŒããããå Žåã«ãªãœãŒã¹ããªãŒã¯ãããªãããã«ããŸãã ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãªãœãŒã¹ãè§£æŸããã«ã¯ã SafeHandle ã䜿çšããŸãã
ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãªãœãŒã¹ã®ãªãŒã¯ãé²ãããã« finally å¥ãå®è¡ããå¿ èŠããªãããšã確èªããŸã
finally å¥ã CER ã®å€éšã§å®è¡ããããšã¯éããªãã®ã§ãã©ã€ãã©ãªéçºè
ã¯ã¢ã³ãããŒãž ãªãœãŒã¹ãè§£æŸããããã«ã finally ãããã¯å
ã®ã³ãŒãã«äŸåããªãããã«ããå¿
èŠããããŸãã
SafeHandleã䜿çšããããšããå§ãããŸãã
ã³ãŒãåæã«ãŒã«
SafeHandleã§ã¯ãªãããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãªãœãŒã¹ãã¯ãªãŒã³ã¢ããããããã«Finalizeã䜿çšããŸãã
IntPtrã¯äœ¿çšããªãã§ãã ãããSafeHandleã䜿çšããŠãªãœãŒã¹ãã«ãã»ã«åããŸãã finally å¥ãå®è¡ããå¿
èŠãããå Žåã¯ãCER å
ã«é
眮ããŸãã
ãã¹ãŠã®ããã¯ã¯ãæ¢åã®ãããŒãžã ãã㯠ã³ãŒããééããå¿ èŠããããŸã
CLR ã¯ãã³ãŒããããã¯ãããŠããã¿ã€ãã³ã°ãèªèããŠãã¹ã¬ãããäžæ¢ããã®ã§ã¯ãªãã AppDomain ãç Žæ£ããå¿ èŠããããŸãã ã¹ã¬ããã«ãã£ãŠæäœãããããŒã¿ãäžæŽåãªç¶æ ã®ãŸãŸã«ãªãå¯èœæ§ããããã¹ã¬ããã®äžæ¢ã¯å±éºãªå ŽåããããŸãã ãããã£ãŠã AppDomain å šäœããªãµã€ã¯ã«ããå¿ èŠããããŸãã ããã¯ã®èå¥ã«å€±æããçµæã¯ããããããã¯ãŸãã¯æ£ãããªãçµæã®ããããã«ãªããŸãã BeginCriticalRegionã¡ãœãããšEndCriticalRegionã¡ãœããã䜿çšããŠãããã¯é åãèå¥ããŸãã çŸåšã®ã¹ã¬ããã«ã®ã¿é©çšããã Thread ã¯ã©ã¹ã®éçã¡ãœããã§ããã1 ã€ã®ã¹ã¬ãããå¥ã®ã¹ã¬ããã®ããã¯ã«ãŠã³ããç·šéããã®ãé²ãã®ã«åœ¹ç«ã¡ãŸãã
EnterãšExitã«ã¯ãã®CLRéç¥ãçµã¿èŸŒãŸããŠããããããããã®äœ¿çšããå§ãã§ãããŸãããããã®ã¡ãœãããå©çšããlockã¹ããŒãã¡ã³ãã®äœ¿çšããå§ãããŸãã
ã¹ãã³ ããã¯ã AutoResetEvent ãªã©ã®ä»ã®ãã㯠ã¡ã«ããºã ã§ã¯ããããã®ã¡ãœãããåŒã³åºããŠãéèŠãªã»ã¯ã·ã§ã³ãå ¥åãããŠããããšã CLR ã«éç¥ããå¿ èŠããããŸãã ãããã®ã¡ãœããã¯ããã¯ãåãåããŸãããã³ãŒããã¯ãªãã£ã«ã« ã»ã¯ã·ã§ã³ã§å®è¡ãããã¹ã¬ãããäžæ¢ãããšå ±æç¶æ ã«äžæŽåãæ®ãå¯èœæ§ãããããšã CLR ã«éç¥ããŸãã ã«ã¹ã¿ã ReaderWriterLock ã¯ã©ã¹ãªã©ãç¬èªã®ããã¯ã®çš®é¡ãå®çŸ©ããå Žåã¯ããããã®ãã㯠ã«ãŠã³ã ã¡ãœããã䜿çšããŸãã
ã³ãŒãåæã«ãŒã«
BeginCriticalRegionãšEndCriticalRegionã䜿çšããŠããã¹ãŠã®ããã¯ãããŒã¯ããŠèå¥ããŸãã ã«ãŒãå ã§ CompareExchangeã Incrementãããã³ Decrement ã䜿çšããªãã§ãã ããã ãããã®ã¡ãœããã® Win32 ããªã¢ã³ãã®ãã©ãããã©ãŒã åŒã³åºãã¯è¡ããªãã§ãã ããã ã«ãŒãå ã§ Sleep ã䜿çšããªãã§ãã ããã æ®çºæ§ãã£ãŒã«ãã¯äœ¿çšããªãã§ãã ããã
ã¯ãªãŒã³ã¢ãã ã³ãŒã㯠finally ãããã¯ãŸã㯠catch ãããã¯ã«å«ãŸããå¿ èŠããããŸããcatch ã«åŸããªã
ã¯ãªãŒã³ã¢ãã ã³ãŒãã¯ã catch ãããã¯ã«åŸãã¹ãã§ã¯ãããŸããã finally ãŸã㯠catch ãããã¯èªäœã«å«ãŸããŠããå¿
èŠããããŸãã ããã¯éåžžã®è¯ãæ¹æ³ã§ãã
finally ãããã¯ã¯ãäŸå€ãã¹ããŒããããšããšãtry ãããã¯ãæ£åžžã«çµäºãããšãã®äž¡æ¹ã§åãã³ãŒããå®è¡ããããããäžè¬ã«åªå
ãããæ¹æ³ã§ãã
ThreadAbortExceptionãªã©ãäºæããªãäŸå€ãã¹ããŒãããå Žåãã¯ãªãŒã³ã¢ãã ã³ãŒãã¯å®è¡ãããŸããã
finallyã§ã¯ãªãŒã³ã¢ããããã¢ã³ãããŒãž ãªãœãŒã¹ã¯ããªãŒã¯ãé²ãããã«ãSafeHandleã«ã©ããããã®ãçæ³çã§ãã C# using ããŒã¯ãŒãã¯ããã³ãã«ãå«ããªããžã§ã¯ããç Žæ£ããããã«å¹æçã«äœ¿çšã§ããããšã«æ³šæããŠãã ããã
AppDomainãªãµã€ã¯ã«ã§ã¯ãã¡ã€ãã©ã€ã¶ãŒ ã¹ã¬ããäžã®ãªãœãŒã¹ãã¯ãªãŒã³ã¢ããã§ããŸãããã¯ãªãŒã³ã¢ãã ã³ãŒããé©åãªå Žæã«é 眮ããããšãéèŠã§ãã ã¹ã¬ãããããã¯ãä¿æããã«éåæäŸå€ãåãåã£ãå ŽåãCLR 㯠AppDomainããªãµã€ã¯ã«ããã«ã¹ã¬ããèªäœãçµäºããããšããŸãã ãªãœãŒã¹ãåŸã§ãªãæ©ãã¯ãªãŒã³ã¢ãããããããã«ãããšãããå€ãã®ãªãœãŒã¹ã䜿çšã§ããããã«ãªããæå¹æéã®ç®¡çãåäžããŸãã ãšã©ãŒ ã³ãŒã ãã¹å ã®ãã¡ã€ã«ãžã®ãã³ãã«ãæç€ºçã«éããªãã£ãå Žåã¯ã SafeHandle ãã¡ã€ãã©ã€ã¶ãŒã«ãã£ãŠã¯ãªãŒã³ã¢ããããããŸã§åŸ æ©ããŸããæ¬¡ã«ã³ãŒããå®è¡ãããšãã«ããã¡ã€ãã©ã€ã¶ãŒããŸã å®è¡ãããŠããªãå Žåã¯ããŸã£ããåããã¡ã€ã«ãžã®ã¢ã¯ã»ã¹ã倱æããå¯èœæ§ããããŸãã ãã®ãããã¯ãªãŒã³ã¢ãã ã³ãŒããååšããæ£ããåäœããããšã確èªãããšãå³å¯ã«å¿ èŠãªãå Žåã§ãããšã©ãŒããããã¯ãªãŒã³ãã€è¿ éã«åŸ©æ§ããã®ã«åœ¹ç«ã¡ãŸãã
ã³ãŒãåæã«ãŒã«
catchåŸã®ã¯ãªãŒã³ã¢ãã ã³ãŒãã¯ãfinally ãããã¯å
ã«ããå¿
èŠããããŸãã dispose ã®åŒã³åºã㯠finally ãããã¯å
ã«çœ®ããŸãã
catch ãããã¯ã¯ãã¹ããŒãŸãã¯åã¹ããŒã§çµäºããå¿
èŠããããŸãã 倿°ã®äŸå€ãååŸããå¯èœæ§ããããããã¯ãŒã¯æ¥ç¶ã確ç«ã§ãããã©ãããæ€åºããã³ãŒããªã©ã®äŸå€ããããŸãããéåžžã®ç¶æ³ã§å€æ°ã®äŸå€ããã£ããããå¿
èŠãããã³ãŒãã¯ãæåãããã©ããã確èªããããã«ã³ãŒãããã¹ãããå¿
èŠãããããšã瀺ãå¿
èŠããããŸãã
ã¢ããªã±ãŒã·ã§ã³ ãã¡ã€ã³é Process-Wide 倿Žå¯èœãªå ±æç¶æ ãæé€ããããå¶çŽä»ãå®è¡ãªãŒãžã§ã³ã䜿çšããå¿ èŠããããŸã
æŠèŠã§èª¬æããããã«ãã¢ããªã±ãŒã·ã§ã³ ãã¡ã€ã³éã®ããã»ã¹å šäœã®å ±æç¶æ ãä¿¡é Œæ§ã®é«ãæ¹æ³ã§ç£èŠãããããŒãžã ã³ãŒããèšè¿°ããããšã¯éåžžã«å°é£ãªå ŽåããããŸãã ããã»ã¹å šäœã®å ±æç¶æ ã¯ãWin32 ã³ãŒããCLR å ããŸãã¯ãªã¢ãŒãåŠçã䜿çšãããããŒãžã ã³ãŒãã®ããããã§ãã¢ããªã±ãŒã·ã§ã³ ãã¡ã€ã³éã§å ±æãããããããçš®é¡ã®ããŒã¿æ§é ã§ãã 倿Žå¯èœãªå ±æç¶æ ã¯ãããŒãžã ã³ãŒãã§æ£ããèšè¿°ããããšã¯éåžžã«å°é£ã§ãããéçãªå ±æç¶æ ã¯çްå¿ã®æ³šæãæã£ãŠè¡ãããå ŽåããããŸãã ããã»ã¹å šäœãŸãã¯ãã·ã³å šäœã®å ±æç¶æ ãããå Žåã¯ãå¶çŽä»ãå®è¡ãªãŒãžã§ã³ (CER) ã䜿çšããŠããã®ç¶æ ãæé€ããããå ±æç¶æ ãä¿è·ãããããäœããã®æ¹æ³ãèŠã€ããŸãã èå¥ããã³ä¿®æ£ãããŠããªãå ±æç¶æ ã®ã©ã€ãã©ãªã§ã¯ãã¯ãªãŒã³ AppDomain ã¢ã³ããŒããå¿ èŠãªãã¹ã (SQL Server ãªã©) ãã¯ã©ãã·ã¥ããå¯èœæ§ãããããšã«æ³šæããŠãã ããã
ã³ãŒãã§ COM ãªããžã§ã¯ãã䜿çšããå Žåã¯ãã¢ããªã±ãŒã·ã§ã³ ãã¡ã€ã³éã§ãã® COM ãªããžã§ã¯ããå ±æããªãããã«ããŸãã
ããã¯ã¯ãããã»ã¹å šäœãŸãã¯ã¢ããªã±ãŒã·ã§ã³ ãã¡ã€ã³éã§ã¯æ©èœããŸããã
ãããŸã§ã¯ã Enter ãš lock ã¹ããŒãã¡ã³ã ã䜿çšããŠã°ããŒãã« ããã»ã¹ ããã¯ãäœæããŠããŸããã ããšãã°ãéå ±æã¢ã»ã³ããªããã®AppDomain ã€ã³ã¹ã¿ã³ã¹ãType ãªããžã§ã¯ããã€ã³ã¿ãŒã³æååããªã¢ãŒãåŠçã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ ãã¡ã€ã³éã§å ±æãããäžéšã®æååãªã©ãThreadã¢ãžã£ã€ã« ã¯ã©ã¹ãããã¯ãããšçºçããŸãã ãããã®ããã¯ã¯ããã¯ãããã»ã¹å šäœã«åœ±é¿ãäžããŠããŸããã ããã»ã¹å šäœã®ã¢ããªã±ãŒã·ã§ã³éãã¡ã€ã³ ããã¯ã®ååšãç¹å®ããã«ã¯ãããã¯å ã®ã³ãŒããããã£ã¹ã¯äžã®ãã¡ã€ã«ãããŒã¿ããŒã¹ãªã©ã®å€éšã®æ°žç¶åããããªãœãŒã¹ã䜿çšããŠãããã©ããã倿ããŸãã
ä¿è·ãããã³ãŒããå€éšãªãœãŒã¹ã䜿çšããå Žåã AppDomain å ã§ããã¯ãåããšããã®ã³ãŒããè€æ°ã®ã¢ããªã±ãŒã·ã§ã³ ãã¡ã€ã³éã§åæã«å®è¡ãããå¯èœæ§ããããããåé¡ãçºçããå¯èœæ§ãããããšã«æ³šæããŠãã ããã ããã¯ã1 ã€ã®ãã° ãã¡ã€ã«ã«æžã蟌ãå Žåããããã»ã¹å šäœã®ãœã±ããã«ãã€ã³ããããšãã«åé¡ã«ãªãå¯èœæ§ããããŸãã ãããã®å€æŽã¯ããããŒãžã ã³ãŒãã䜿çšããŠãååä»ã Mutex ãŸã㯠Semaphore ã€ã³ã¹ã¿ã³ã¹ã䜿çšãã以å€ã«ãããã»ã¹ ã°ããŒãã« ããã¯ãååŸããç°¡åãªæ¹æ³ããªãããšãæå³ããŸãã 2 ã€ã®ã¢ããªã±ãŒã·ã§ã³ ãã¡ã€ã³ã§åæã«å®è¡ãããªãã³ãŒããäœæãããã Mutex ã¯ã©ã¹ãŸã㯠Semaphore ã¯ã©ã¹ã䜿çšããŸãã æ¢åã®ã³ãŒãã倿Žã§ããªãå Žåã¯ããã¡ã€ã㌠ã¢ãŒãã§å®è¡ãããšãåããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã¹ã¬ããããã¥ãŒããã¯ã¹ãååŸããŠè§£æŸããããšãä¿èšŒã§ããªãããããã®åæãå®çŸããããã« Win32 ååä»ããã¥ãŒããã¯ã¹ã䜿çšããªãã§ãã ããã ãããŒãžã Mutex ã¯ã©ã¹ããŸãã¯ååä»ã ManualResetEventã AutoResetEventããŸã㯠Semaphore ã䜿çšããŠãã¢ã³ãããŒãž ã³ãŒãã䜿çšããŠããã¯ãåæããã®ã§ã¯ãªããCLR ãèªèããæ¹æ³ã§ã³ãŒã ããã¯ãåæããå¿ èŠããããŸãã
ãtypeof(MyType) ã®ããã¯ãé¿ããã
ãŸãããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ ãã¡ã€ã³ã§å ±æãããã³ãŒãã®ã³ããŒã 1 ã€ã ãã®å ±æã¢ã»ã³ããªå ã®ãã©ã€ããŒã ãªããžã§ã¯ããšãããªã㯠Type ãªããžã§ã¯ãã«ãåé¡ããããŸãã å ±æã¢ã»ã³ããªã®å Žåãããã»ã¹ããšã« Type ã®ã€ã³ã¹ã¿ã³ã¹ã¯ 1 ã€ã ãã§ããã€ãŸããè€æ°ã®ã¢ããªã±ãŒã·ã§ã³ ãã¡ã€ã³ããŸã£ããåã Type ã€ã³ã¹ã¿ã³ã¹ãå ±æããŸãã Type ã€ã³ã¹ã¿ã³ã¹ã«ããã¯ãèšå®ãããšãAppDomainã ãã§ãªããããã»ã¹å šäœã«åœ±é¿ããããã¯ãé©çšãããŸãã ãã AppDomain ã Type ãªããžã§ã¯ãã«ããã¯ãåããšããã®ã¹ã¬ããã¯çªç¶äžæ¢ãããããã¯ã¯è§£é€ãããŸããã ãã®ããã¯ã«ãããä»ã®ã¢ããªã±ãŒã·ã§ã³ ãã¡ã€ã³ããããããã¯ããå¯èœæ§ããããŸãã
éçã¡ãœããã§ããã¯ãååŸããè¯ãæ¹æ³ã¯ãéçå éšåæãªããžã§ã¯ããã³ãŒãã«è¿œå ããããšã§ãã ãããååšããå Žåã¯ã¯ã©ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã§åæåã§ããŸãããååšããªãå Žåã¯æ¬¡ã®ããã«åæåã§ããŸãã
private static Object s_InternalSyncObject;
private static Object InternalSyncObject
{
get
{
if (s_InternalSyncObject == null)
{
Object o = new Object();
Interlocked.CompareExchange(
ref s_InternalSyncObject, o, null);
}
return s_InternalSyncObject;
}
}
ããã¯ãååŸãããšãã¯ã InternalSyncObject ããããã£ã䜿çšããŠãããã¯ãããªããžã§ã¯ããååŸããŸãã ã¯ã©ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã§å
éšåæãªããžã§ã¯ããåæåããŠããå Žåã¯ããã®ããããã£ã䜿çšããå¿
èŠã¯ãããŸããã ããã« ãã§ã㯠ããã¯åæåã³ãŒãã¯ã次ã®äŸã®ããã«ãªããŸãã
public static MyClass SingletonProperty
{
get
{
if (s_SingletonProperty == null)
{
lock(InternalSyncObject)
{
// Do not use lock(typeof(MyClass))
if (s_SingletonProperty == null)
{
MyClass tmp = new MyClass(âŠ);
// Do all initialization before publishing
s_SingletonProperty = tmp;
}
}
}
return s_SingletonProperty;
}
}
lock(this) ã«é¢ããæ³šæäºé
äžè¬ã«ããããªãã¯ã«ã¢ã¯ã»ã¹å¯èœãªåã ã®ãªããžã§ã¯ããããã¯ããããšã¯èš±å®¹ãããŸãã ãã ãããªããžã§ã¯ããã·ã³ã°ã«ãã³ ãªããžã§ã¯ãã§ããããµãã·ã¹ãã å šäœããããããã¯ãåŒãèµ·ããå¯èœæ§ãããå Žåã¯ãäžèšã®èšèšãã¿ãŒã³ã®äœ¿çšãæ€èšããŠãã ããã ããšãã°ã1 ã€ã® SecurityManager ãªããžã§ã¯ããããã¯ãããšã AppDomain å ã§ãããããã¯ãçºçãã AppDomain å šäœã䜿çšã§ããªããªãå¯èœæ§ããããŸãã ãã®åã®ãããªãã¯ã«ã¢ã¯ã»ã¹å¯èœãªãªããžã§ã¯ããããã¯ããªãããšããå§ãããŸãã ãã ããåã ã®ã³ã¬ã¯ã·ã§ã³ãŸãã¯é åãããã¯ããŠããéåžžã¯åé¡ã¯çºçããŸããã
ã³ãŒãåæã«ãŒã«
ã¢ããªã±ãŒã·ã§ã³ ãã¡ã€ã³éã§äœ¿çšãããå¯èœæ§ãããåããå³å¯ãª ID æèŠãæããªãåã«å¯ŸããŠããã¯ãåããªãã§ãã ããã EnterãTypeãMethodInfoãPropertyInfoãStringãValueTypeããŸãã¯ThreadããæŽŸçãããªããžã§ã¯ãã«å¯ŸããŠMarshalByRefObjectãåŒã³åºããªãã§ãã ããã
GC.KeepAlive åŒã³åºããåé€ããŸãã
æ¢åã®ã³ãŒãã®å€§éšåã¯ãKeepAlive ã䜿çšãã¹ãæã«äœ¿çšããŠããªãã£ãããé©åã§ãªãæã«äœ¿çšããŠãããããŸãã SafeHandleã«å€æããåŸãã¯ã©ã¹ã¯ãã¡ã€ãã©ã€ã¶ãŒãæããªããããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãã³ãã«ãçµäºããããã«KeepAliveã«äŸåããŠãããšä»®å®ããŠãSafeHandleãåŒã³åºãå¿ èŠã¯ãããŸããã KeepAliveã®åŒã³åºããä¿æããããã©ãŒãã³ã¹ ã³ã¹ãã¯ãããããã§ãããKeepAliveã®åŒã³åºãã¯ãååšããªããªã£ãå¯èœæ§ã®ããæå¹æéã®åé¡ã解決ããããã«å¿ èŠã§ããããååã§ãããšããèªèã«ãããã³ãŒãã®ä¿å®ãå°é£ã«ãªããŸãã ãã ããCOM çžäºéçš CLR åŒã³åºãå¯èœã©ãã㌠(RCW) ã䜿çšããå Žåã KeepAlive ã¯ã³ãŒãã§åŒãç¶ãå¿ èŠã§ãã
ã³ãŒãåæã«ãŒã«
KeepAlive ãåé€ããŸãã
HostProtection 屿§ã䜿çšãã
HostProtectionAttribute (HPA) ã¯ã宣èšåã»ãã¥ãªã㣠ã¢ã¯ã·ã§ã³ã䜿çšããŠãã¹ãä¿è·ã®èŠä»¶ã決å®ããŸããããã«ããããã¹ãã¯ãå®å šã«ä¿¡é Œãããã³ãŒãã§ããç¹å®ã®ãã¹ãã«äžé©åãªç¹å®ã®ã¡ãœãã (SQL Server ã®ExitãShowãªã©) ãåŒã³åºããªãããã«ããããšãã§ããŸãã
HPA ã¯ãå ±éèšèªã©ã³ã¿ã€ã ããã¹ãããSQL Server ãªã©ã®ãã¹ãä¿è·ãå®è£ ããã¢ã³ãããŒãžã ã¢ããªã±ãŒã·ã§ã³ã«ã®ã¿åœ±é¿ããŸãã ã»ãã¥ãªã㣠ã¢ã¯ã·ã§ã³ãé©çšãããšãã¯ã©ã¹ãŸãã¯ã¡ãœãããå ¬éãããã¹ã ãªãœãŒã¹ã«åºã¥ããŠãªã³ã¯èŠæ±ãäœæãããŸãã ã³ãŒããã¯ã©ã€ã¢ã³ã ã¢ããªã±ãŒã·ã§ã³ãŸãã¯ãã¹ãã§ä¿è·ãããŠããªããµãŒããŒã§å®è¡ãããŠããå Žåã屿§ã¯ "èžçº" ããŸããæ€åºãããªããããé©çšãããŸããã
Von Bedeutung
ãã®å±æ§ã®ç®çã¯ãã»ãã¥ãªãã£åäœã§ã¯ãªãããã¹ãåºæã®ããã°ã©ãã³ã° ã¢ãã« ã¬ã€ãã©ã€ã³ãé©çšããããšã§ãã ãªã³ã¯èŠæ±ã¯ããã°ã©ãã³ã° ã¢ãã«ã®èŠä»¶ãžã®æºæ ã確èªããããã«äœ¿çšãããŸããã HostProtectionAttribute ã¯ã»ãã¥ãªãã£ã¢ã¯ã»ã¹èš±å¯ã§ã¯ãããŸããã
ãã¹ãã«ããã°ã©ãã³ã° ã¢ãã«ã®èŠä»¶ããªãå Žåããªã³ã¯ã®èŠæ±ã¯çºçããŸããã
ãã®å±æ§ã¯ã次ãèå¥ããŸãã
ãã¹ã ããã°ã©ãã³ã° ã¢ãã«ã«ã¯é©åããªããããã以å€ã®å Žåã¯ç¡å®³ãªã¡ãœãããŸãã¯ã¯ã©ã¹ã
ãã¹ã ããã°ã©ãã³ã° ã¢ãã«ã«é©åããããµãŒããŒãããŒãžã ãŠãŒã¶ãŒ ã³ãŒããäžå®å®ã«ãªãå¯èœæ§ãããã¡ãœãããŸãã¯ã¯ã©ã¹ã
ãã¹ã ããã°ã©ãã³ã° ã¢ãã«ã«é©åããããµãŒã㌠ããã»ã¹èªäœãäžå®å®ã«ãªãå¯èœæ§ãããã¡ãœãããŸãã¯ã¯ã©ã¹ã
泚
ãã¹ãã§ä¿è·ãããç°å¢ã§å®è¡ãããå¯èœæ§ã®ããã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠåŒã³åºãããã¯ã©ã¹ ã©ã€ãã©ãªãäœæããå Žåã¯ããªãœãŒã¹ ã«ããŽãª HostProtectionResource å ¬éããã¡ã³ããŒã«ãã®å±æ§ãé©çšããå¿ èŠããããŸãã ãã®å±æ§ãæã€ .NET Framework ã¯ã©ã¹ ã©ã€ãã©ãª ã®ã¡ã³ããŒã«ãããçŽã¡ã«åŒã³åºãå ã®ã¿ããã§ãã¯ãããŸãã ã«ã¹ã¿ã ã®ã©ã€ãã©ãª ã¡ã³ããŒã«ã€ããŠããåãããã«çŽåã®åŒã³åºãå ããã§ãã¯ãããããã«ããå¿ èŠããããŸãã
HPA ã®è©³çްã«ã€ããŠã¯ã HostProtectionAttributeãåç §ããŠãã ããã
ã³ãŒãåæã«ãŒã«
SQL Server ã®å ŽåãåæãŸãã¯ã¹ã¬ããåãå°å ¥ããããã«äœ¿çšããããã¹ãŠã®ã¡ãœããã HPA ã§èå¥ããå¿ èŠããããŸãã ããã«ã¯ãç¶æ ãå ±æããããåæããããå€éšããã»ã¹ã管çãããããã¡ãœãããå«ãŸããŸãã SQL Server ã«åœ±é¿ãäžãã HostProtectionResource å€ã¯ã SharedStateã Synchronizationãããã³ ExternalProcessMgmtã§ãã ãã ãããã¹ãŠã® HostProtectionResource ãå ¬éããã¡ãœããã¯ãSQL ã«åœ±é¿ãäžãããªãœãŒã¹ã䜿çšããŠããã¡ãœããã ãã§ãªããHPA ã«ãã£ãŠèå¥ãããå¿ èŠããããŸãã
ã¢ã³ãããŒãž ã³ãŒãã§ç¡æéã«ãããã¯ããªã
ãããŒãžã ã³ãŒãã§ã¯ãªãã¢ã³ãããŒãž ã³ãŒãã§ãããã¯ãããšãCLR ãã¹ã¬ãããäžæ¢ã§ããªãããããµãŒãã¹æåŠæ»æãçºçããå¯èœæ§ããããŸãã ãããã¯ãããã¹ã¬ããã¯ãCLR ã AppDomainãã¢ã³ããŒãããã®ãé²ããŸããå°ãªããšããéåžžã«å®å
šã§ãªãæäœãè¡ãå¿
èŠã¯ãããŸããã Windows åæããªããã£ãã䜿çšãããããã¯ã¯ãèš±å¯ã§ããªãããšã®æç¢ºãªäŸã§ãã ãœã±ããã§ ReadFile ãåŒã³åºãéã®ãããã¯ã¯ãå¯èœã§ããã°åé¿ããå¿
èŠããããŸããçæ³çã«ã¯ãWindows API ã¯ããã®ãããªæäœãã¿ã€ã ã¢ãŠãããããã®ã¡ã«ããºã ãæäŸããå¿
èŠããããŸãã
ãã€ãã£ããåŒã³åºãã¡ãœããã¯ãçæ³çã«ã¯ã劥åœãªæéã¿ã€ã ã¢ãŠãã§ Win32 åŒã³åºãã䜿çšããå¿ èŠããããŸãã ãŠãŒã¶ãŒãã¿ã€ã ã¢ãŠããæå®ã§ããå ŽåããŠãŒã¶ãŒã¯ãç¹å®ã®ã»ãã¥ãªãã£ã¢ã¯ã»ã¹èš±å¯ãªãã§ç¡éã¿ã€ã ã¢ãŠããæå®ããããšã¯ã§ããŸããã ã¬ã€ãã©ã€ã³ãšããŠãã¡ãœãããæå€§ 10 ç§ãè¶ ããŠãããã¯ãããå Žåã¯ãã¿ã€ã ã¢ãŠãããµããŒãããããŒãžã§ã³ã䜿çšããå¿ èŠããããŸãããŸãã¯ã远å ã® CLR ãµããŒããå¿ èŠã§ãã
åé¡ã®ãã API ã®äŸãããã€ã次ã«ç€ºããŸãã ãã€ã (å¿åãšååä»ãã®äž¡æ¹) ã¯ã¿ã€ã ã¢ãŠãã§äœæã§ããŸãããã ããã³ãŒãã¯ãNMPWAIT_WAIT_FOREVERã§ CreateNamedPipe ãåŒã³åºããã WaitNamedPipe ãããããªãããã«ããå¿
èŠããããŸãã ããã«ãã¿ã€ã ã¢ãŠããæå®ãããŠããå Žåã§ããäºæããªããããã¯ãçºçããå¯èœæ§ããããŸãã å¿åãã€ãã§ WriteFile ãåŒã³åºããšããã¹ãŠã®ãã€ããæžã蟌ãŸãããŸã§ãããã¯ãããŸããã€ãŸãããããã¡ãŒã«æªèªããŒã¿ãããå Žåã WriteFile åŒã³åºãã¯ããªãŒããŒããã€ãã®ãããã¡ãŒå
ã®é åãè§£æŸãããŸã§ãããã¯ãããŸãã ãœã±ããã§ã¯ãã¿ã€ã ã¢ãŠã ã¡ã«ããºã ãåãå
¥ãã API ãåžžã«äœ¿çšããå¿
èŠããããŸãã
ã³ãŒãåæã«ãŒã«
ã¢ã³ãããŒãžã ã³ãŒãã§ã¿ã€ã ã¢ãŠããªãã§ãããã¯ããããšã¯ããµãŒãã¹æåŠæ»æã§ãã
WaitForSingleObjectãWaitForSingleObjectExãWaitForMultipleObjectsãMsgWaitForMultipleObjectsãããã³MsgWaitForMultipleObjectsExã«å¯ŸããŠãã©ãããã©ãŒã åŒã³åºããå®è¡ããªãã§ãã ããã NMPWAIT_WAIT_FOREVERã¯äœ¿çšããªãã§ãã ããã
STA ã«äŸåããæ©èœãèå¥ãã
COM ã·ã³ã°ã« ã¹ã¬ãã ã¢ããŒãã¡ã³ã (STA) ã䜿çšããã³ãŒããç¹å®ããŸãã SQL Server ããã»ã¹ã§ã¯ãSTA ã¯ç¡å¹ã«ãªããŸãã ããã©ãŒãã³ã¹ ã«ãŠã³ã¿ãŒãã¯ãªããããŒããªã©ã CoInitializeã«äŸåããæ©èœã¯ãSQL Server å
ã§ç¡å¹ã«ããå¿
èŠããããŸãã
ãã¡ã€ãã©ã€ã¶ãŒã«åæã®åé¡ããªãããšã確èªãã
.NET Framework ã®å°æ¥ã®ããŒãžã§ã³ã«ã¯ãè€æ°ã®ãã¡ã€ãã©ã€ã¶ãŒ ã¹ã¬ãããååšããå¯èœæ§ããããŸããã€ãŸããåãåã®ç°ãªãã€ã³ã¹ã¿ã³ã¹ã®ãã¡ã€ãã©ã€ã¶ãŒãåæã«å®è¡ãããŸãã å®å šã«ã¹ã¬ãã ã»ãŒãã§ããå¿ èŠã¯ãããŸãããã¬ããŒãž ã³ã¬ã¯ã¿ãŒã¯ãç¹å®ã®ãªããžã§ã¯ã ã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠãã¡ã€ãã©ã€ã¶ãŒãå®è¡ããã¹ã¬ããã 1 ã€ã ãã§ããããšãä¿èšŒããŸãã ãã ããè€æ°ã®ç°ãªããªããžã§ã¯ã ã€ã³ã¹ã¿ã³ã¹ã§åæã«å®è¡ããå Žåã¯ãç«¶åç¶æ ããããããã¯ãåé¿ããããã«ãã¡ã€ãã©ã€ã¶ãŒãã³ãŒãã£ã³ã°ããå¿ èŠããããŸãã ãã¡ã€ãã©ã€ã¶ãŒã§ãã° ãã¡ã€ã«ãžã®æžã蟌ã¿ãªã©ã®å€éšç¶æ ã䜿çšããå Žåã¯ãã¹ã¬ããã®åé¡ãåŠçããå¿ èŠããããŸãã ã¹ã¬ãã ã»ãŒããæäŸããããã«æçµåŠçã«äŸåããªãã§ãã ããã ãã¡ã€ãã©ã€ã¶ãŒ ã¹ã¬ããã«ç¶æ ãæ ŒçŽããããã«ããããŒãžããŸãã¯ãã€ãã£ãã®ã¹ã¬ãã ããŒã«ã« ã¹ãã¬ãŒãžã䜿çšããªãã§ãã ããã
ã³ãŒãåæã«ãŒã«
ãã¡ã€ãã©ã€ã¶ãŒã¯ãåæã®åé¡ãå«ãŸãªãå¿ èŠããããŸãã ãã¡ã€ãã©ã€ã¶ãŒã§éç倿Žå¯èœãªç¶æ ã䜿çšããªãã§ãã ããã
å¯èœãªå Žåã¯ã¢ã³ãããŒãž ã¡ã¢ãªãé¿ãã
ã¢ã³ãããŒãžã ã¡ã¢ãªã¯ããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãã³ãã«ãšåæ§ã«ãªãŒã¯ãããå¯èœæ§ããããŸãã å¯èœã§ããã°ã stackalloc ãŸãã¯åºå®ããããããŒãžã ãªããžã§ã¯ã ( åºå®ã¹ããŒãã¡ã³ã ãbyte[] ã䜿çšãã GCHandle ãªã©) ã䜿çšããŠãã¹ã¿ãã¯äžã®ã¡ã¢ãªã䜿çšããŠã¿ãŠãã ããã GCã¯æçµçã«ããããã¯ãªãŒã³ã¢ããããŸãã ãã ããã¢ã³ãããŒãž ã¡ã¢ãªãå²ãåœãŠãå¿ èŠãããå Žåã¯ã SafeHandle ããæŽŸçããã¯ã©ã¹ã䜿çšããŠã¡ã¢ãªå²ãåœãŠãã©ããããããšãæ€èšããŠãã ããã
SafeHandleãååã§ãªãã±ãŒã¹ãå°ãªããšã 1 ã€ãããŸãã ã¡ã¢ãªã®å²ãåœãŠãŸãã¯è§£æŸãè¡ã COM ã¡ãœããåŒã³åºãã§ã¯ã1 ã€ã® DLL ã CoTaskMemAlloc ãä»ããŠã¡ã¢ãªãå²ãåœãŠãã®ãäžè¬çã§ãããå¥ã® DLL 㯠CoTaskMemFreeã§ãã®ã¡ã¢ãªãè§£æŸããŸãã
SafeHandle ããããã®å Žæã§äœ¿çšããããšã¯äžé©åã§ããã¢ã³ãããŒãž ã¡ã¢ãªã®æå¹æéã SafeHandle ã®æå¹æéã«é¢é£ä»ããããšãããããã¡ã¢ãªã®æå¹æéãä»ã® DLL ãå¶åŸ¡ããã®ã劚ããŸãã
catch(Exception) ã®ãã¹ãŠã®äœ¿çšã確èªãã
1 ã€ã®ç¹å®ã®äŸå€ã§ã¯ãªãããã¹ãŠã®äŸå€ããã£ãããããããã¯ããã£ãããããšãéåæäŸå€ããã£ãããããããã«ãªããŸããã ãã¹ãŠã® catch(Exception) ãããã¯ã調ã¹ãŠãã¹ããããããå¯èœæ§ã®ããéèŠãªãªãœãŒã¹è§£æŸã³ãŒããããŒã«ãã㯠ã³ãŒããååšããªããã©ããã確èªãããŸããThreadAbortExceptionãStackOverflowExceptionããŸãã¯OutOfMemoryExceptionãåŠçããããã«ãcatch ãããã¯å ã§èª€ã£ãåäœãçºçããå¯èœæ§ããããã©ããã調æ»ããŠãã ããã ãã®ã³ãŒãã¯ãç¹å®ã®äŸå€ã®ã¿ã衚瀺ãããå¯èœæ§ãããããŸãã¯äŸå€ãçºçãããã³ã« 1 ã€ã®ç¹å®ã®çç±ã§å€±æãããšããåæããã°ã«èšé²ãŸãã¯è¡ã£ãŠããå¯èœæ§ãããããšã«æ³šæããŠãã ããã ãããã®åææ¡ä»¶ã¯ã ThreadAbortExceptionãå«ããããã«æŽæ°ããå¿ èŠãããå ŽåããããŸãã
ãã¹ãŠã®äŸå€ããã£ããããç®æããæåŸ ãããç¹å®ã®çš®é¡ã®äŸå€ããã£ããããããã«å€æŽããããšãæ€èšããŠãã ãããäŸãã°ãæååã®æžåŒèšå®ã¡ãœããããã®FormatExceptionãªã©ã§ãã ããã«ãããcatch ãããã¯ãäºæããªãäŸå€ã§å®è¡ãããã®ãé²ããäºæããªãäŸå€ããã£ããããŠã³ãŒãããã°ãé ããªãããã«ããã®ã«åœ¹ç«ã¡ãŸãã äžè¬çãªã«ãŒã«ãšããŠãã©ã€ãã©ãª ã³ãŒãã§äŸå€ãåŠçããããšã¯ãããŸãã (äŸå€ããã£ããããå¿ èŠãããã³ãŒãã¯ãåŒã³åºããŠããã³ãŒãã®èšèšäžã®æ¬ é¥ã瀺ããŠããå¯èœæ§ããããŸã)ã å Žåã«ãã£ãŠã¯ãäŸå€ããã£ããããå¥ã®äŸå€ã®çš®é¡ãã¹ããŒããŠãããå€ãã®ããŒã¿ãæäŸãããå ŽåããããŸãã ãã®å Žåã¯ãå ¥ãåã«ãªã£ãäŸå€ã䜿çšããŠããšã©ãŒã®å®éã®åå ãæ°ããäŸå€ã® InnerException ããããã£ã«æ ŒçŽããŸãã
ã³ãŒãåæã«ãŒã«
ãã¹ãŠã®ãªããžã§ã¯ãããã£ãããããããã¹ãŠã®äŸå€ããã£ãããããããŒãžã ã³ãŒãå
ã®ãã¹ãŠã® catch ãããã¯ã確èªããŸãã C# ã§ã¯ããã㯠catch{} ãš catch(Exception){}ã®äž¡æ¹ã«ãã©ã°ãèšå®ããŸãã äŸå€ã®çš®é¡ãéåžžã«å
·äœçã«ããããšãæ€èšããããäºæããªãäŸå€ã®çš®é¡ããã£ããããå Žåã«äžé©åãªæ¹æ³ã§åäœããªãããã«ã³ãŒãã確èªããŠãã ããã
ãããŒãžã ã¹ã¬ããã Win32 ã¹ã¬ãããšæ³å®ããªãã§ãã ãããå®éãããã¯ãã¡ã€ããŒã§ãã
ãããŒãžã ã¹ã¬ãã ããŒã«ã« ã¹ãã¬ãŒãžã®äœ¿çšã¯æ©èœããŸãããã¢ã³ãããŒãžã ã¹ã¬ãã ããŒã«ã« ã¹ãã¬ãŒãžã䜿çšããªãå Žåããã³ãŒããçŸåšã®ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã¹ã¬ããã§å床å®è¡ããããšæ³å®ããå ŽåããããŸãã ã¹ã¬ããã®ãã±ãŒã«ãªã©ã®èšå®ã¯å€æŽããªãã§ãã ããã ããã¯ã«å
¥ã£ããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã¹ã¬ãããããã¯ãçµäºããå¿
èŠãããããããã©ãããã©ãŒã åŒã³åºããä»ã㊠InitializeCriticalSection ãŸã㯠CreateMutex ãåŒã³åºããªãã§ãã ããã ãã¡ã€ããŒã䜿çšããå Žåã¯ãããåœãããªããããWin32 ã¯ãªãã£ã«ã« ã»ã¯ã·ã§ã³ãšãã¥ãŒããã¯ã¹ã SQL ã§çŽæ¥äœ¿çšããããšã¯ã§ããŸããã ãããŒãžã Mutex ã¯ã©ã¹ã§ã¯ããããã®ã¹ã¬ãã ã¢ãã£ããã£ã®åé¡ã¯åŠçãããªãããšã«æ³šæããŠãã ããã
ãããŒãžã ã¹ã¬ãã ããŒã«ã« ã¹ãã¬ãŒãžãã¹ã¬ããã®çŸåšã® UI ã«ã«ãã£ãªã©ããããŒãžã Thread ãªããžã§ã¯ãã®ç¶æ ã®ã»ãšãã©ãå®å šã«äœ¿çšã§ããŸãã ThreadStaticAttributeã䜿çšããããšãã§ããŸããããã«ãããæ¢åã®éç倿°ã®å€ã«çŸåšã®ãããŒãžã ã¹ã¬ããã®ã¿ãã¢ã¯ã»ã¹ã§ããããã«ãªããŸã (ãã㯠CLR ã§ãã¡ã€ã㌠ããŒã«ã« ã¹ãã¬ãŒãžãå®è¡ãããã 1 ã€ã®æ¹æ³ã§ã)ã ããã°ã©ãã³ã° ã¢ãã«ã®çç±ãããSQL ã§å®è¡ãããšãã«ã¹ã¬ããã®çŸåšã®ã«ã«ãã£ã倿Žããããšã¯ã§ããŸããã
ã³ãŒãåæã«ãŒã«
SQL Server ã¯ãã¡ã€ã㌠ã¢ãŒãã§å®è¡ãããŸããã¹ã¬ãã ããŒã«ã« ã¹ãã¬ãŒãžã¯äœ¿çšããªãã§ãã ããã
TlsAllocãTlsFreeãTlsGetValueãããã³TlsSetValue.ãžã®ãã©ãããã©ãŒã åŒã³åºããé¿ããã
SQL Server ã§åœè£ ãåŠçã§ããããã«ãã
åœè£
ã¯ã¹ã¬ãã ã¬ãã«ã§åäœããSQL ã¯ãã¡ã€ã㌠ã¢ãŒãã§å®è¡ã§ããããããããŒãžã ã³ãŒãã¯ãŠãŒã¶ãŒãåœè£
ããã RevertToSelfãåŒã³åºãã¹ãã§ã¯ãããŸããã
ã³ãŒãåæã«ãŒã«
SQL Server ãåœè£
ãåŠçã§ããããã«ããŸãã
RevertToSelfãImpersonateAnonymousTokenãDdeImpersonateClientãImpersonateDdeClientWindowãImpersonateLoggedOnUserãImpersonateNamedPipeClientãImpersonateSelfãRpcImpersonateClientãRpcRevertToSelfãRpcRevertToSelfExããŸãã¯SetThreadTokenã¯äœ¿çšããªãã§ãã ããã
Thread::Suspend ãåŒã³åºããªã
ã¹ã¬ãããäžæããæ©èœã¯åçŽãªæäœã®ããã«èŠãããããããŸãããããããããã¯ãçºçããå¯èœæ§ããããŸãã ããã¯ãä¿æããŠããã¹ã¬ããã 2 çªç®ã®ã¹ã¬ããã«ãã£ãŠäžæãããåŸã2 çªç®ã®ã¹ã¬ãããåãããã¯ãååŸããããšãããšããããããã¯ãçºçããŸãã Suspend ã¯ãçŸåšãã»ãã¥ãªãã£ãã¯ã©ã¹ã®èªã¿èŸŒã¿ããªã¢ãŒãåŠçãããã³ãªãã¬ã¯ã·ã§ã³ã劚ããå¯èœæ§ããããŸãã
ã³ãŒãåæã«ãŒã«
Suspend ãåŒã³åºããªãã§ãã ããã SemaphoreãManualResetEventãªã©ãå®éã®åæããªããã£ãã代ããã«äœ¿çšããããšãæ€èšããŠãã ããã
å¶çŽä»ãå®è¡é åãšä¿¡é Œæ§ã³ã³ãã©ã¯ãã䜿çšããŠéèŠãªæäœãä¿è·ãã
å ±æç¶æ ãæŽæ°ããè€éãªæäœãå®è¡ããå ŽåããŸãã¯å®å šã«æåãããå®å šã«å€±æããããæ±ºå®è«çã«è¡ãå¿ èŠãããå Žåã¯ãå¶çŽä»ãå®è¡ãªãŒãžã§ã³ (CER) ã«ãã£ãŠä¿è·ãããŠããããšã確èªããŠãã ããã ããã«ãããçªç¶ã®ã¹ã¬ããã®äžæ¢ãçªç¶ã® AppDomain ã¢ã³ããŒãã§ãã£ãŠãããã¹ãŠã®ã±ãŒã¹ã§ã³ãŒããå®è¡ãããŸãã
CER ã¯ãtry/finallyã®åŒã³åºãã®çŽåã«ããç¹å®ã®PrepareConstrainedRegions ãããã¯ã§ãã
ããã«ãããjust-in-time ã³ã³ãã€ã©ã¯ã try ãããã¯ãå®è¡ããåã« finally ãããã¯å
ã®ãã¹ãŠã®ã³ãŒããæºåããããã«æç€ºããŸãã ããã«ãããfinally ãããã¯å
ã®ã³ãŒãããã«ãããããã¹ãŠã®ã±ãŒã¹ã§å®è¡ãããŸãã CER ã§ç©ºã® try ãããã¯ã䜿çšããããšã¯çãããããŸããã CER ã䜿çšãããšãéåæã¹ã¬ããã®äžæ¢ãã¡ã¢ãªäžè¶³ã®äŸå€ããä¿è·ãããŸãã éåžžã«æ·±ãã³ãŒãã®ã¹ã¿ã㯠ãªãŒããŒãããŒãåŠçãã CER ã®åœ¢åŒã«ã€ããŠã¯ã ExecuteCodeWithGuaranteedCleanup ãåç
§ããŠãã ããã