.NET рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЬрд╛рдирдирд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред CLR рдЯреНрд░рд┐рдХ рдХреИрд╕реЗ рдХрд░реЗ? StackOverflowException рдХреЛ рдкрдХрдбрд╝рдХрд░ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЬреАрд╡рд┐рдд рдХреИрд╕реЗ рд░рд╣реЗрдВ? рдХреНрдпрд╛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдЕрд╕рдВрднрд╡ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдХрдЯреМрддреА рдХреЗ рддрд╣рдд, рд╣рдорд╛рд░реЗ
рдбреЙрдЯрдиреЗрдХреНрд╕реНрдЯ 2018 рдкрд╛рдЗрдЯрд░ рд╕рдореНрдореЗрд▓рди рд╕реЗ рдпреВрдЬреАрди (
рдПрдкреЗрд╢рдХ )
рдкреЗрд╢рдХреЛрд╡ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐, рдЬрд╣рд╛рдВ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрди рдФрд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреАред
рдирдорд╕реНрддреЗ! рдореЗрд░рд╛ рдирд╛рдо рдпреВрдЬреАрди рд╣реИред рдореИрдВ SKB рдХреЛрдВрдЯреВрд░ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдПрдХ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреИрдирд╛рдд рдХрд░рддрд╛ рд╣реВрдВред рд▓рдмреНрдмреЛрд▓реБрдЖрдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдЙрддреНрдкрд╛рдж рджрд▓ рд╣реИрдВ рдЬреЛ рдЕрдкрдиреА рд╕реЗрд╡рд╛рдПрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╣рдорд╛рд░реЗ рд╕рд╛рде рд╣реЛрд╕реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдБрдЪреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╕рд╛рди рдФрд░ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЦрдкрдд рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛ рдпрд╛ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреГрддрд┐рдпрд╛рдВ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ред
рдХрднреА-рдХрднреА рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╣реЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рд╣рдордиреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рддрд░реАрдХреЗ рджреЗрдЦреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдХреЛрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдХреНрд░реИрд╢ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреБрдЫ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдФрд░ рдХрд░рд╛рдорд╛рддреА рдЕрдкрд╡рд╛рдж рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдирд╛ рд╣реИред
рдЖрдЬ рдореИрдВ .NET рдореЗрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред рд╣рдордиреЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЗрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рджреМрд░рд╛рдиред
рдпреЛрдЬрдирд╛
- .NET рдЕрдкрд╡рд╛рдж рд╡реНрдпрд╡рд╣рд╛рд░
- рд╡рд┐рдВрдбреЛрдЬ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдФрд░ рд╣реИрдХ
рдирд┐рдореНрди рдореЗрдВ рд╕реЗ рд╕рднреА Windows рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИред рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкреВрд░реНрдг .NET 4.7.1 рдврд╛рдВрдЪреЗ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред .NET Core рдХреЗ рдХреБрдЫ рд╕рдВрджрд░реНрдн рднреА рд╣реЛрдВрдЧреЗред
рдкрд╣реБрдВрдЪ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди
рдпрд╣ рдЕрдкрд╡рд╛рдж рдЧрд▓рдд рдореЗрдореЛрд░реА рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХреЛрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрд╕рдХреА рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИред рдЕрдкрд╡рд╛рдж рдирд┐рдореНрди рд╕реНрддрд░ рд╣реИ, рдФрд░ рдЖрдорддреМрд░ рдкрд░, рдпрджрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдмрд╣реБрдд рд▓рдВрдмреА рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдЖрдЗрдП C # рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрддрд╛ 1000 рдХреЛ рдмрд╛рдЗрдЯ 42 рд▓рд┐рдЦрддреЗ рд╣реИрдВ (рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ 1000 рдПрдХ рдХрд╛рдлреА рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрддрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ)ред
try { Marshal.WriteByte((IntPtr) 1000, 42); } catch (AccessViolationException) { ... }
WriteByte рдХреЛ рдмрд╕ рд╡рд╣реА рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП: рдпрд╣ рджрд┐рдП рдЧрдП рдкрддреЗ рдкрд░ рдПрдХ рдмрд╛рдЗрдЯ рд▓рд┐рдЦрддрд╛ рд╣реИред рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреЙрд▓ AccessViolationException рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ред рдпрд╣ рдХреЛрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛, рдпрд╣ рд╕рдВрднрд╛рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛ред рдЕрдм рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓реЗрдВ:
try { var bytes = new byte[] {42}; Marshal.Copy(bytes, 0, (IntPtr) 1000, bytes.Length); } catch (AccessViolationException) { ... }
рдЕрдЧрд░ WriteByte рдХреЗ рдмрдЬрд╛рдп рдЖрдк рдХреЙрдкреА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдЗрдЯ 42 рдХреЛ рдкрддрд╛ 1000 рддрдХ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЯреНрд░рд╛рдЗ-рдХреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, AccessViolation рдХреЛ рдирд╣реАрдВ рдкрдХрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдХрдВрд╕реЛрд▓ рдкрд░ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдирдЪрд╛рд╣реЗ AccessViolusException рдХреЗ рдХрд╛рд░рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рдерд╛ред
Marshal.Copy(bytes, 0, (IntPtr) 1000, bytes.Length); Marshal.WriteByte((IntPtr) 1000, 42);
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдб рдХреА рджреЛ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реИрдВ, рдЬрдмрдХрд┐ рдкрд╣рд▓рд╛ AccessViolation рдХреЗ рд╕рд╛рде рдкреВрд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреНрд░реИрд╢ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░реЛрд╕реЗрд╕реНрдб рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реИред рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рдЕрдВрджрд░ рд╕реЗ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЪрд▓реЛ рдХреЙрдкреА рд╡рд┐рдзрд┐ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
static void Copy(...) { Marshal.CopyToNative((object) source, startIndex, destination, length); } [MethodImpl(MethodImplOptions.InternalCall)] static extern void CopyToNative(object source, int startIndex, IntPtr destination, int length);
рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╡рд┐рдзрд┐ рдХрд░рддрд╛ рд╣реИред CopyToNative рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред .NET рдХреЗ рдЕрдВрджрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрднреА рднреА рдХреНрд░реИрд╢ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдХрд╣реАрдВ рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреЗрд╡рд▓ CopyToNative рдХреЗ рдЕрдВрджрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╕реЗ рд╣рдо рдкрд╣рд▓рд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдпрджрд┐ .NET рдХреЛрдб рдХреЛ рдиреЗрдЯрд┐рд╡ рдХреЛрдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ AccessViolation рдЗрд╕рдХреЗ рдЕрдВрджрд░ рд╣реЛрддрд╛ рд╣реИ, рддреЛ .NET рдХреЛрдб рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЛ рдирд╣реАрдВ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред
рдЕрдм рд╣рдо рд╕рдордЭреЗрдВрдЧреЗ рдХрд┐ WriteByte рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ AccessViolation рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдХреНрдпреЛрдВ рд╕рдВрднрд╡ рдерд╛ред рдЖрдЗрдП рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ:
unsafe static void WriteByte(IntPtr ptr, byte val) { try { *(byte*) ptr = val; } catch (NullReferenceException) {
рдпрд╣ рд╡рд┐рдзрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рдореЗрдВ рд▓рд╛рдЧреВ рд╣реИред рдпрд╣ рд╡рд╛рдВрдЫрд┐рдд рдкрддреЗ рдкрд░ рдбреЗрдЯрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП C #-рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ NullReferenceException рдХреЛ рднреА рдкрдХрдбрд╝рддрд╛ рд╣реИред рдпрджрд┐ NRE рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ AccessViolationException рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП
рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди рдХреА рд╡рдЬрд╣ рд╕реЗ рдпрд╣ рдЬрд░реВрд░реА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдереНрд░реЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдлреЗрдВрдХреЗ рдЧрдП рд╕рднреА рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдЕрдЧрд░ WriteByte рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдПрдХ NullReferenceException рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо AccessViolation рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдПрдХ рдПрдирдЖрд░рдИ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рдкрддреЗ рдХреЛ рд╢реВрдиреНрдп рдХреЗ рдмрдЬрд╛рдп 1000 рддрдХ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рд╣рдо рд╕реАрдзреЗ C # рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдкрддреЗ рдкрд░ рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ NullReferenceException рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
*(byte*) 1000 = 42;
рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ, рд╣рдореЗрдВ рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдореЗрдореЛрд░реА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдореЛрд░реА рдореЗрдВ, рд╕рднреА рдкрддреЗ рдЖрднрд╛рд╕реА рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рдмрдбрд╝реА рдкрддрд╛ рдЬрдЧрд╣ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдХреБрдЫ рдкреГрд╖реНрда рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рд▓реЗрдХрд┐рди рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ: рдкрд╣рд▓реЗ 64 рдХреЗрдмреА рдХреЗ рдкрддреЗ рдХреЛ рдХрднреА рднреА рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдореЗрдВ рдореИрдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Rantime .NET рдпрд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ AccessViolation рдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рдореЗрдВ рд╣реБрдЖ рд╣реИ, рддреЛ рд░рдирдЯрд╛рдЗрдо рдЪреЗрдХ рдЬреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдкрддрд╛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдПрдХ рдЙрдкрдпреБрдХреНрдд рдЕрдкрд╡рд╛рдж рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред 0 рд╕реЗ 2 ^ 16 рддрдХ рдХреЗ рдкрддреЗ рдХреЗ рд▓рд┐рдП - рд╕рднреА рдХреЗ рд▓рд┐рдП NullReference, AccessViolationред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╢реВрдиреНрдп рдкрддреЗ рддрдХ рдкрд╣реБрдВрдЪрддреЗ рд╕рдордп рди рдХреЗрд╡рд▓ рдирд▓рд░реЗрд▓реЗрдВрд╕ рдХреНрдпреЛрдВ рдлреЗрдВрдХрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкрд╣реБрдБрдЪ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рдВрджрд░реНрдн рд╢реВрдиреНрдп рд╣реИ:

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо NullReferenceException рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдХреНрд╖реЗрддреНрд░ рддрдХ рдкрд╣реБрдВрдЪ рдЗрд╕ рд╡рд╕реНрддреБ рдХреЗ рдкрддреЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдСрдлрд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдРрд╕реЗ рдкрддреЗ рдкрд░ рдЬрд╛рдПрдВрдЧреЗ рдЬреЛ рд╢реВрдиреНрдп рдХреЗ рдХрд░реАрдм рд╣реИ (рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░реА рдореВрд▓ рд╡рд╕реНрддреБ рдХрд╛ рд▓рд┐рдВрдХ рд╢реВрдиреНрдп рд╣реИ)ред рдЗрд╕ рд░рдирдЯрд╛рдЗрдо рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рд╕реНрд╡рдпрдВ рд╡рд╕реНрддреБ рдХреЗ рдкрддреЗ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рддреНрдпрд╛рдкрди рдХреЗ рдмрд┐рдирд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЕрдкрд╡рд╛рдж рдорд┐рд▓рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреА рдУрд░ рдореБрдбрд╝ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╡рд╕реНрддреБ рд╕реНрд╡рдпрдВ 64 рдХреЗрдмреА рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рд╣реЛ рдЬрд╛рддреА рд╣реИ?

рдХреНрдпрд╛ рд╣рдо рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ AccessViolation рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЪрд▓реЛ рдПрдХ рдкреНрд░рдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЪрд▓реЛ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝реА рд╡рд╕реНрддреБ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдЗрд╕рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реЗрдВрдЧреЗред рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рдлрд╝реАрд▓реНрдб, рдЕрдВрдд рдореЗрдВ рджреВрд╕рд░рд╛:

рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпрд╛рдБ рдПрдХ NullReferenceException рдХреЛ рдлреЗрдВрдХ рджреЗрдЧреАред рдХреЛрдИ AccessViolationException рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрдЧреАред
рдЖрдЗрдП рдЙрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рджреЗрдЦреЗрдВ рдЬреЛ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рд╣реЛрдВрдЧреЗред рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬреЗрдЖрдИрдЯреА рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реАрдПрдордкреА рдирд┐рд░реНрджреЗрд╢ рдЬреЛрдбрд╝рд╛ рд╣реИ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкрддреЗ рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдХреНрд╕реЗрд╕рд╡рд┐рдУрд▓реЗрд╢рди рдХреЛ рд╢реВрдиреНрдп рдкрддреЗ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд░рдирдЯрд╛рдЗрдо рджреНрд╡рд╛рд░рд╛ NullReferenceException рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рдгреА рдХреЛ рдПрдХ рдмрдбрд╝реА рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдХреНрдпреЛрдВ? рдЗрд╕ рд╕рд╡рд╛рд▓ рдХреЛ рдкрд╛рдардХ рдкрд░ рдЫреЛрдбрд╝реЗрдВ, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рд▓рд┐рдЦреЗрдВ :)
рдЪрд▓реЛ AccessViolation рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВред

AccessViolationException рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреА рд╣реИ рдЬрд╣рд╛рдВ рдкрд░ рдЕрдкрд╡рд╛рдж рд╣реБрдЖ (рдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рдореЗрдВ рдпрд╛ рдореВрд▓ рдореЗрдВ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рдореЗрдВ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рд╣реБрдЖ рд╣реИ, рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкрддрд╛ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ: рдХреНрдпрд╛ рд╣рдо рдПрдХ AccessViolationException рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдореВрд▓ рдХреЛрдб рдпрд╛ рдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рдореЗрдВ рд╣реБрдИ рдереА, рд▓реЗрдХрд┐рди NullReference рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рд╣реБрдИ рдФрд░ рди рд╣реА рдереНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛? рдпрд╣ рдХрднреА-рдХрднреА рдПрдХ рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реЛред рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ .NET рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

.NET 1.0 рдореЗрдВ, рдХреЛрдИ AccessViolationException рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдереАред рд╕рднреА рд▓рд┐рдВрдХ рдХреЛ рд╡реИрдз рдпрд╛ рдЕрд╢рдХреНрдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ред .NET 2.0 рдХреЗ рд╕рдордп рддрдХ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХреЗ рдмрд┐рдирд╛ - рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ, рдФрд░ AccessViolation рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдЬрдмрдХрд┐ рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдерд╛ред 4.0 рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдпрд╣ рдЕрднреА рднреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдм рдЖрдкрдХреЛ рдЙрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреИрдЪ рдмреНрд▓реЙрдХ рд╣реИрдВрдбрд▓реЗрдкреНрд░реЛрд╕реЗрд╕рдХреНрд░реЙрдкреНрдЯреЗрдбрд╕реНрдЯреИрдЯрдЯреЗрд╕реЗрдкреНрд╢рди рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рдд рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рд▓рдЧрд╛ рдХрд┐ AccessViolationException рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдереА рдЬрд┐рд╕реЗ рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдкрдХрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд┐рдЫрдбрд╝реА рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП, рд░рдирдЯрд╛рдЗрдо рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ:
- legacyNullReferenceExceptionPolicy рд░рд┐рдЯрд░реНрди .NET 1.0 рд╡реНрдпрд╡рд╣рд╛рд░ - рд╕рднреА AVs NRE рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВ
- legacyCorruptedStateExceptionPolicy рд░рд┐рдЯрд░реНрди .NET 2.0 рд╡реНрдпрд╡рд╣рд╛рд░ - рд╕рднреА AV рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯреЗрдб рд╣реИрдВ
.NET рдореЗрдВ, Core AccessViolation рдХреЛ рд╕рдВрднрд╛рд▓рд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдереА:

.NET 4.7.1 рдХреЗ рддрд╣рдд рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди .NET 3.5 рдХреЗ рддрд╣рдд рдирд┐рд░реНрдорд┐рдд рдПрдХ рд╕рд╛рдЭрд╛ рдХреЛрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдПрдХ рдЖрд╡рдзрд┐рдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдерд╛:
while (isRunning) { try { action(); } catch (Exception e) { log.Error(e); } WaitForNextExecution(... ); }
рд╣рдордиреЗ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рд╕реЗ рдЗрд╕ рд╕рд╣рд╛рдпрдХ рдХреЗ рдкрд╛рд╕ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреАред рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рд╡рд╣ AccessViolation рдХреЗ рд╕рд╛рде рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЧрдпрд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдиреЗ рд▓рдЧрд╛рддрд╛рд░ рдХреНрд░реИрд╢ рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп, AccessViolation рд▓реЙрдЧ рдХрд┐рдпрд╛ 3.5 рдХреЗ рддрд╣рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХреЛрдб рдЗрд╕реЗ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЕрд╡рд░реЛрдзрди рдЙрд╕ рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЯрд╛рд░рдЧреЗрдЯрдлреНрд░реЙрдорд╡рд░реНрдХ рдкрд░, рдЬрд┐рд╕рдХреЗ рддрд╣рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЗрд╕рдХреА рдирд┐рд░реНрднрд░рддрд╛рдПрдВред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рджреЗрдирд╛ред AccessVilolation рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣рд╛рдВ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реБрдЖ рд╣реИ - рджреЗрд╢реА рдпрд╛ рдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рдореЗрдВ рдФрд░ рд╕рд╛рде рд╣реА рдЯрд╛рд░рдЧреЗрдЯрдлреНрд░реЙрдорд╡рд░реНрдХ рдФрд░ рд░рдирдЯрд╛рдЗрдо рд╕реЗрдЯрд┐рдВрдЧреНрд╕ред
рдзрд╛рдЧрд╛ рдЧрд░реНрднрдкрд╛рдд
рдХрднреА-рдХрднреА рдХреЛрдб рдореЗрдВ рдЖрдкрдХреЛ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдереНрд░реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдмреЛрд░реНрдЯ ();
var thread = new Thread(() => { try { ... } catch (ThreadAbortException e) { ... Thread.ResetAbort(); } }); ... thread.Abort();
рдЬрдм рдПрдмреЙрд░реНрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдереНрд░реЗрдб рдереНрд░реЗрдб рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдереНрд░реЗрдбрдмреЛрд░реНрдЯ рдПрдХреНрд╕рд╕реЗрдкреНрд╢рди рдлреЗрдВрдХрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдХреЛрдб рдЗрд╕ рддрд░рд╣:
var thread = new Thread(() => { try { тАж } catch (ThreadAbortException e) { тАж } }); ... thread.Abort();
рдЗрд╕рдХреЗ рдмрд┐рд▓реНрдХреБрд▓ рдмрд░рд╛рдмрд░:
var thread = new Thread(() => { try { ... } catch (ThreadAbortException e) { ... throw; } }); ... thread.Abort();
рдпрджрд┐ рдЖрдкрдХреЛ рдереНрд░реЗрдбрдЕрдмреЛрд░реНрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдмрдВрдж рдХрд┐рдП рдЧрдП рдереНрд░реЗрдб рдореЗрдВ рдХреБрдЫ рдЕрдиреНрдп рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк Thread.ResetAbort () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдпрд╣ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд░реЛрдХрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рдФрд░ рдЕрдкрд╡рд╛рдж рд╕реНрдЯреИрдХ рдХреЛ рдЙрдЪреНрдЪрддрд░ рдлреЗрдВрдХрдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдереНрд░реЗрдбред рдПрдмреЙрд░реНрдЯ () рд╡рд┐рдзрд┐ рд╕реНрд╡рдпрдВ рдХреБрдЫ рднреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддреА рд╣реИ - рдмрдВрдж рдзрд╛рдЧреЗ рдореЗрдВ рдХреЛрдб рдЗрд╕реЗ рд░реЛрдХрдиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИред
рдереНрд░реЗрдб рдХреА рдПрдХ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ред рдПрдмреЛрд░реНрдЯ () рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдб рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рдкрдХрдбрд╝ рдореЗрдВ рд╣реИ рдФрд░ рдЕрдВрдд рдореЗрдВ рдмреНрд▓реЙрдХ рд╣реИред
рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛрдб рдХреЗ рдЕрдВрджрд░, рдЖрдк рдЕрдХреНрд╕рд░ рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЯреНрд░рд╛рдпрд▓ рдмреНрд▓реЙрдХ рдЦрд╛рд▓реА рд╣реИ рдФрд░ рд╕рднреА рддрд░реНрдХ рдЕрдВрдд рдореЗрдВ рд╣реИрдВред рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕ рдХреЛрдб рдХреЛ рдереНрд░реЗрдбрдмреЛрд░реНрдЯрдПрдХреНрд╕рд╕реЗрдкреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдлреЗрдВрдХреЗ рдЬрд╛рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ .bort () рд╡рд┐рдзрд┐ рдкрд┐рд░реЛрдпрд╛ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ ThreadAbortException рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдЗрди рджреЛрдиреЛрдВ рддрдереНрдпреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдПрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдХрд┐ рдереНрд░реЗрдбред рдПрдмреЙрд░реНрдЯ () рд╡рд┐рдзрд┐ рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдб рдХреЛ рдмреНрд▓реЙрдХ рдХрд░ рд╕рдХрддреА рд╣реИред
var thread = new Thread(() => { try { } catch { }
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХреЛрд╢рд┐рд╢ рдореЗрдВ рддреИрдирд╛рдд рд╣реИ / рдЕрдВрдд рдореЗрдВ, рдЕрдВрдд рдореЗрдВ рдЕрдВрджрд░, рдирд┐рдкрдЯрд╛рди рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдШрдЯрдирд╛ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддрд╛рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЕрдЧрд░ рдереНрд░реЗрдбред рдПрдмреЙрд░реНрдЯ рдХреЛ рд░рди рдЯрд╛рдЗрдо рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдбрд┐рд╕реНрдкреЛрдЬрд╝ - рдереНрд░реЗрдбред рдПрдмреЙрд░реНрдЯ () рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧрд╛ред рддреЛ рд╣рдореЗрдВ рдЦрд░реЛрдВрдЪ рд╕реЗ рд▓рдЧрднрдЧ рдПрдХ рддрд╛рд▓рд╛ рдорд┐рд▓рддрд╛ рд╣реИред
.NET рдХреЛрд░ рдореЗрдВ, Thread.Abort () рд╡рд┐рдзрд┐ рдПрдХ PlatformNotSupportedException рдлреЗрдВрдХрддрд╛ рд╣реИред рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореБрдЭреЗ рдереНрд░реЗрдб рдПрдмреЛрд░реНрдЯ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдЗрдирд╡реЗрд╕рд┐рд╡ рддрд░реАрдХреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреИрдВрд╕рд┐рд▓реЗрд╢рдирдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
рдпрд╛рдж рд╕реЗ рдмрд╛рд╣рд░
рдпрд╣ рдЕрдкрд╡рд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдорд╢реАрди рдкрд░ рдореЗрдореЛрд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдХрдо рд╣реИред рдпрд╛ рдЬрдм рд╣рдо 32-рдмрд┐рдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╕реАрдорд╛рдУрдВ рдореЗрдВ рднрд╛рдЧ рдЧрдПред рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рднрд▓реЗ рд╣реА рдХрдВрдкреНрдпреВрдЯрд░ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдореБрдлреНрдд рдореЗрдореЛрд░реА рд╣реЛ, рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ 64-рдмрд┐рдЯ рд╣реИред
var arr4gb = new int[int.MaxValue/2];
рдКрдкрд░ рд╡рд╛рд▓рд╛ рдХреЛрдб OutOfMemory рдлреЗрдВрдХ рджреЗрдЧрд╛ред рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, 2 рдЬреАрдмреА рд╕реЗ рдмрдбрд╝реА рд╡рд╕реНрддреБрдУрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рдпрд╣ App.config рдореЗрдВ gcAllowVeryLargeObjects рд╕реЗрдЯ рдХрд░рдХреЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, 4 рдЬреАрдмреА рд╕рд░рдгреА рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред
рдЕрдм рдПрдХ рдФрд░ рднреА рдЕрд░реИ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред
var largeArr = new int[int.MaxValue];
рдЕрдм рднреА gcAllowVeryLargeObjects рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐
рдХрд┐рд╕реА рд╕рд░рдгреА рдореЗрдВ рдЕрдзрд┐рдХрддрдо рд╕реВрдЪрдХрд╛рдВрдХ рдкрд░ .NET рдХреА
рд╕реАрдорд╛ рд╣реИ ред рдпрд╣ рдкреНрд░рддрд┐рдмрдВрдз int.MaxValue рд╕реЗ рдХрдо рд╣реИред
рдЕрдзрд┐рдХрддрдо рд╕рд░рдгреА рд╕реВрдЪрдХрд╛рдВрдХ:
- рдмрд╛рдЗрдЯ рд╕рд░рдгрд┐рдпрд╛рдБ - 0x7FFFFFC7
- рдЕрдиреНрдп рд╕рд░рдгрд┐рдпрд╛рдБ - 0X7F E FFFFF
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ OutOfMemoryException рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдо рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдЦрд┐рд▓рд╛рдл рдЖрдП рд╣реИрдВ, рд╕реНрдореГрддрд┐ рдХреА рдХрдореА рдирд╣реАрдВред
рдХрднреА-рдХрднреА OutOfMemory рдХреЛ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдЕрдВрджрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

рдпрд╣ string.Concat рдкрджреНрдзрддрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ int.MaxValue рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдПрдХ OutOfMemoryException рдХреЛ рддреБрд░рдВрдд рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЪрд▓реЛ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ рдЬрдм рдЖрдЙрдЯрдСрдлрд╝рдореЗрд░реА рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдарддрд╛ рд╣реИ рдЬрдм рдореЗрдореЛрд░реА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреА рд╣реИред
LimitMemory(64.Mb()); try { while (true) list.Add(new byte[size]); } catch (OutOfMemoryException e) { Console.WriteLine(e); }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЕрдкрдиреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдореЗрдореЛрд░реА рдХреЛ 64 рдПрдордмреА рддрдХ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛, рд▓реВрдк рдХреЗ рдЕрдВрджрд░, рдирдИ рдмрд╛рдЗрдЯ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рд╢реАрдЯ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ рддрд╛рдХрд┐ рдЬреАрд╕реА рдЙрдиреНрд╣реЗрдВ рдЗрдХрдЯреНрдард╛ рди рдХрд░реЗрдВ, рдФрд░ рдЖрдЙрдЯрдСрдлрдореЗрд░реА рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
- рдЕрдкрд╡рд╛рдж рд╕рдВрднрд╛рд▓рд╛
- рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЧрд┐рд░ рдЬрд╛рдПрдЧреА
- рдЪрд▓реЛ рдкрдХрдбрд╝ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдкрд╡рд╛рдж рдлрд┐рд░ рд╕реЗ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛
- рдЪрд▓реЛ рдкрдХрдбрд╝ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди StackOverflow рджреБрд░реНрдШрдЯрдирд╛ рд╣реЛрдЧреА
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧреИрд░-рдирд┐рдпрддрд╛рддреНрдордХ рд╣реЛрдЧрд╛ред рдЖрдЗрдП рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ:
- рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред .NET рдХреЗ рдЕрдВрджрд░, рдЖрдкрдХреЛ OutOfMemoryException рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рд░реЛрдХ рд░рд╣рд╛ рд╣реИред
- рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЧрд┐рд░ рд╕рдХрддреА рд╣реИред рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдмрдВрдзрд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рди рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд░рдирдЯрд╛рдЗрдо рдХреЛрдб рднреА рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреАрд╕реАред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рд╕реНрдерд┐рддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рд░рдирдЯрд╛рдЗрдо рдЕрдкрдиреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрдкрд╡рд╛рдж рдХреЛ рдкрдХрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред
- рдЪрд▓рд┐рдП рдкрдХрдбрд╝ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдкрд╡рд╛рдж рдлрд┐рд░ рд╕реЗ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдХреИрдЪ рдХреЗ рдЕрдВрджрд░, рд╣рдо рд╡рд╣ рдХрд╛рд░реНрдп рднреА рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рд╣рдореЗрдВ рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рд╣рдо рдХрдВрд╕реЛрд▓ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВ), рдФрд░ рдпрд╣ рдПрдХ рдирдпрд╛ рдЕрдкрд╡рд╛рдж рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
- рдЪрд▓реЛ рдкрдХрдбрд╝ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди StackOverflow рджреБрд░реНрдШрдЯрдирд╛ рд╣реЛрдЧреАред рд╕реНрдЯреИрдХрдСрд╡рд░рдлреНрд▓реЛ рд╕реНрд╡рдпрдВ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд░рд╛рдЗрдЯрд▓рд╛рдЗрди рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдХреЛрдИ рд╕реНрдЯреИрдХ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИред рдЖрдЗрдП рдЗрд╕рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВред

рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдореЗрдВ, рдкреГрд╖реНрдареЛрдВ рдХреЛ рди рдХреЗрд╡рд▓ рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдореЗрдВ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЖрд░рдХреНрд╖рд┐рдд рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдкреГрд╖реНрда рдЖрд░рдХреНрд╖рд┐рдд рд╣реИ, рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдиреЗ рдиреЛрдЯ рдХрд┐рдпрд╛ рдХрд┐ рд╡рд╣ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рдерд╛ред рдпрджрд┐ рдкреГрд╖реНрда рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЗрдореЛрд░реА рдпрд╛ рд╕реНрд╡реИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ "рдкреНрд░рддрд┐рдмрджреНрдз" (рдкреНрд░рддрд┐рдмрджреНрдз) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдЯреИрдХ рдЗрд╕ рдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЗрдореЛрд░реА рдХреЛ рдЖрд░рдХреНрд╖рд┐рдд рдФрд░ рдкреНрд░рддрд┐рдмрджреНрдз рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдо рд░рд╛рдЗрдЯрд▓рд╛рдЗрди рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВ, рдЬреЛ рд╕реНрдЯреИрдХ рдкрд░ рдХреБрдЫ рдЬрдЧрд╣ рд▓реЗрддреА рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╕рднреА рдкреНрд░рддрд┐рдмрджреНрдз рдореЗрдореЛрд░реА рдкрд╣рд▓реЗ рд╣реА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдордп рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рдФрд░ рдЖрд░рдХреНрд╖рд┐рдд рдкреГрд╖реНрда рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдореЗрдВ рдореИрдк рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╛рдЗрдЯ рд╕рд░рдгрд┐рдпреЛрдВ рд╕реЗ рднрд░рд╛ рд╣реИред рдпрд╣ StackOverflow рдХреЗ рдЕрдкрд╡рд╛рдж рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред
рдирд┐рдореНрди рдХреЛрдб рдЖрдкрдХреЛ рд╕реНрдЯреНрд░реАрдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдореЗрдореЛрд░реА рдХреЛ рд╕реНрдЯреИрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
new Thread(() => F(), 4*1024*1024).Start();
рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рдЕрдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВрдХреЙрдореНрдкрдЯрд┐рдЯрд╣реНрд░реЗрдбрд╕реНрдЯреИрдХ
рд░рдирдЯрд╛рдЗрдо рд╕реЗрдЯрд┐рдВрдЧ ред рдЗрд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдереНрд░реЗрдб рд╕реНрдЯреИрдХ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рд╣реЛред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдореЗрдВ рдордирд╛рдпрд╛ рдЧрдпрд╛ рдЕрд▓рдЧ рд╣реИред

рдвреЗрд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣
рдЪрд▓реЛ StackOverflowException рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рдЖрдЗрдП рджреЛ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ, рд╣рдо рдЕрдирдВрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рджреВрд╕рд░реЗ рдореЗрдВ рд╣рдо рд╕рд┐рд░реНрдл рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВред
try { InfiniteRecursion(); } catch (Exception) { ... }
try { throw new StackOverflowException(); } catch (Exception) { ... }
рдЪреВрдВрдХрд┐ рд╕рднреА рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдЕрдкрд╡рд╛рдж рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдВрдЧреЗред рдФрд░ рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред
MSDN рдХреА рдУрд░ рдореБрдбрд╝реЗрдВ:
"рдЖрдк рд╕реНрдЯреИрдХ рдУрд╡рд░рдлрд╝реНрд▓реЛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдирд╣реАрдВ рдкрдХрдбрд╝ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдкрд╡рд╛рдж-рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛрдб рдХреЛ рд╕реНрдЯреИрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред"
MSDN
рдпрд╣ рдпрд╣рд╛рдВ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ StackOverflowException рдХреЛ рдирд╣реАрдВ рдкрдХрдбрд╝ рдкрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЕрд╡рд░реЛрдзрди рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдЯреИрдХ рд╕реНрдкреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╣реА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЪреБрдХрд╛ рд╣реИред
рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕ рдЕрдкрд╡рд╛рдж рд╕реЗ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ, рдЖрдк RuntimeHelpers рд╡рд░реНрдЧ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
RuntimeHelpers.EnsureSufficientExecutionStack ();
- "рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╢реЗрд╖ рд╕реНрдЯреИрдХ рд╕реНрдкреЗрд╕ рдФрд╕рдд .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдмрдбрд╝рд╛ рд╣реИред" - MSDN
- InsufficientExecutionStackException
- 512 KB - x86, AnyCPU, 2 MB - x64 (рд╕реНрдЯреИрдХ рдЖрдХрд╛рд░ рдХрд╛ рдЖрдзрд╛)
- 64/128 KB - .NET рдХреЛрд░
- рдХреЗрд╡рд▓ рд╕реНрдЯреИрдХ рдкрддрд╛ рд╕реНрдерд╛рди рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ
рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐
рдФрд╕рдд .NET рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЧрд╣ рд╣реИред рд▓реЗрдХрд┐рди
рдФрд╕рдд рдлрд╝рдВрдХреНрд╢рди рдХреНрдпрд╛ рд╣реИ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдпрд╣ рд╡рд┐рдзрд┐ рдкреБрд╖реНрдЯрд┐ рдХрд░рддреА рд╣реИ рдХрд┐ рд╕реНрдЯреИрдХ рдкрд░ рдЗрд╕рдХрд╛ рдХрдо рд╕реЗ рдХрдо рдЖрдзрд╛ рдЖрдХрд╛рд░ рдореБрдлреНрдд рд╣реИред .NET Core рдореЗрдВ, рдпрд╣ 64K рдлреНрд░реА рдореЗрдВ рдЪреЗрдХ рдХрд░рддрд╛ рд╣реИред
.NET рдХреЛрд░ рдореЗрдВ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рднреА рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИ: RuntimeHelpers.TryEnsureSufficientExecutionStack () рдЬреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдмреВрд▓ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рд╕реА # 7.2 рдиреЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реНрдкреИрди рдФрд░ рд╕реНрдЯреИрдХрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреЗрд╢ рдХреАред рд╢рд╛рдпрдж рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рд╕реНрдЯреИрдХрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрдб рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╕реНрдЯреИрдХрдСрд╡рд░рдлреНрд▓реЛ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╕реНрдореГрддрд┐ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рдЪреБрдирдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рд╡рд┐рдзрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд
рд╣реИ рдЬреЛ рд╕реНрдЯреИрдХ рдкрд░ рдЖрд╡рдВрдЯрди рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддреА рд╣реИ рдФрд░
рдЯреНрд░рд╛рдЗрд╕реНрдЯрд╛рдХреЙрд▓реЙрдХ рдирд┐рд░реНрдорд╛рдгред
Span<byte> span; if (CanAllocateOnStack(size)) span = stackalloc byte[size]; else span = new byte[size];
MSDN рдкрд░ StackOverflow рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдБ
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЬрдм рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлрд╝реНрд▓реЛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдХреЙрдорди рд▓реИрдВрдЧреНрд╡реЗрдЬ рд░рдирдЯрд╛рдЗрдо (CLR) рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддреА рд╣реИред тАЭ
MSDN
рдпрджрд┐ рдХреЛрдИ "рд╕рд╛рдорд╛рдиреНрдп" рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИ рдЬреЛ StackOverflow рдХреЗ рджреМрд░рд╛рди рдЧрд┐рд░рддрд╛ рд╣реИ, рддреЛ рдЧреИрд░-рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИрдВ рдЬреЛ рдЧрд┐рд░рддреЗ рдирд╣реАрдВ рд╣реИрдВ? рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрддрд░ рд╕реЗ CLR рд╕реНрддрд░ рддрдХ рдПрдХ рд╕реНрддрд░ рдиреАрдЪреЗ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ред

"рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреЛ рд╕реАрдПрд▓рдЖрд░ рдХреЛ рд╣реЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕реАрдПрд▓рдЖрд░ рдЙрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЛрдореЗрди рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рджреЗрддрд╛ рд╣реИред" - MSDN
StackOverflowException -> AppDomainUnloadedException
рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреЛ рд╕реАрдПрд▓рдЖрд░ рдХреЛ рд╣реЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реИ, рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЛрдореЗрди рдЕрдирд▓реЛрдб рд╣реЛ, рдЬрд┐рд╕ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдпрд╣ рдУрд╡рд░рдлреНрд▓реЛ рд╣реБрдЖред рддреЛ рд╣рдо рдПрдХ StackOverflowException рдХреЛ AppDomainUnloadedException рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдЬрдм рдПрдХ рдкреНрд░рдмрдВрдзрд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ .NET рд░рдирдЯрд╛рдЗрдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рджреВрд╕рд░реЗ рд░рд╛рд╕реНрддреЗ рд╕реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди (C ++ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ) рд▓рд┐рдЦреЗрдВ, рдЬреЛ CLR рдмрдврд╝рд╛рдиреЗ рдФрд░ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ CLR рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ CLR- рд╣реЛрд╕реНрдЯ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕реЗ рд▓рд┐рдЦрдХрд░ рд╣рдо рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдХрдИ рдЪреАрдЬреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрд░ рдФрд░ рдереНрд░реЗрдб рдореИрдиреЗрдЬрд░ рдХреЛ рдмрджрд▓реЗрдВред рд╣рдо рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдореЗрдореЛрд░реА рдХреЗ рдкреГрд╖реНрдареЛрдВ рдХреА рдЕрджрд▓рд╛-рдмрджрд▓реА рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП CLR- рд╣реЛрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдирд┐рдореНрди рдХреЛрдб CLR- рд╣реЛрд╕реНрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ StackOverflow рдХреЗ рджреМрд░рд╛рди AppDomain (C ++) рдЕрдирд▓реЛрдб рд╣реЛ рдЬрд╛рдП:
ICLRPolicyManager *policyMgr; pCLRControl->GetCLRManager(IID_ICLRPolicyManager, (void**) (&policyMgr)); policyMgr->SetActionOnFailure(FAIL_StackOverflow, eRudeUnloadAppDomain);
рдХреНрдпрд╛ рдпрд╣ StackOverflow рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ? рд╢рд╛рдпрдж рдмрд╣реБрдд рдирд╣реАрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ C ++ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рджреВрд╕рд░реЗ, рд╣рдореЗрдВ рдЕрдкрдирд╛ C # рдХреЛрдб рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ StackOverflowException рдХреЛ рдлреЗрдВрдХрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдЕрд▓рдЧ AppDomain рдФрд░ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рд╣рдорд╛рд░рд╛ рдХреЛрдб рддреБрд░рдВрдд рдРрд╕реЗ рдиреВрдбрд▓реНрд╕ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛:
try { var appDomain = AppDomain.CreateDomain("..."); appDomain.DoCallBack(() => { var thread = new Thread(() => InfiniteRecursion()); thread.Start(); thread.Join(); }); AppDomain.Unload(appDomain); } catch (AppDomainUnloadedException) { }
InfiniteRecursion рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд▓рд┐рдЦрд╛ред рддреАрд╕рд░рд╛, рд╣рдордиреЗ AppDomain рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдФрд░ рдпрд╣ рд▓рдЧрднрдЧ рдирдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИред рдЕрдкрд╡рд╛рджреЛрдВ рд╕рд╣рд┐рддред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
public class CustomException : Exception {} var appDomain = AppDomain.CreateDomain( "..."); appDomain.DoCallBack(() => throw new CustomException()); System.Runtime.Serialization.SerializationException: Type 'CustomException' is not marked as serializable. at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
рдЪреВрдБрдХрд┐ рд╣рдорд╛рд░реЗ рдЕрдкрд╡рд╛рдж рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдХреЛрдб рдПрдХ SerializationException рдХреЗ рд╕рд╛рде рдЧрд┐рд░ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдЕрдкрд╡рд╛рдж рдХреЛ Serializable рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ, рд╣рдореЗрдВ рдЕрднреА рднреА рдХреНрд░рдорд╛рдВрдХрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
[Serializable] public class CustomException : Exception { public CustomException(){} public CustomException(SerializationInfo info, StreamingContext ctx) : base(info, context){} } var appDomain = AppDomain.CreateDomain("..."); appDomain.DoCallBack(() => throw new CustomException());
рдпрд╣ рд╕рдм рдмрд╣реБрдд рд╕реБрдВрджрд░ рдирд╣реАрдВ рдирд┐рдХрд▓рд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ - рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рд╣реИрдХреНрд╕ рдХреЗ рд╕реНрддрд░ рддрдХ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕реЗрд╣ / рд╡рд╛рд╣рди

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рдмрдВрдзрд┐рдд-рдЕрдкрд╡рд╛рджреЛрдВ рдиреЗ рдкреНрд░рдмрдВрдзрд┐рдд рдФрд░ CLR рдХреЗ рдмреАрдЪ рдЙрдбрд╝рд╛рди рднрд░реА, рдЬрдмрдХрд┐ SEH-рдЕрдкрд╡рд╛рдж CLR рдФрд░ Windows рдХреЗ рдмреАрдЪ рдЙрдбрд╝рд╛рди рднрд░рддреЗ рд╣реИрдВред
SEH - рд╕рдВрд░рдЪрд┐рдд рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ
- рд╡рд┐рдВрдбреЛрдЬ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЗрдВрдЬрди
- рдпреВрдирд┐рдлреЙрд░реНрдо рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдФрд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ
- рдПрд╕рдИрдПрдЪ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓рд╛рдЧреВ рд╕реА # рдЕрдкрд╡рд╛рдж
SEH рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рддрдВрддреНрд░ рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЖрдП рдХрд┐рд╕реА рднреА рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реНрддрд░ рд╕реЗ, рдпрд╛ рд╕реНрд╡рдпрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рддрд░реНрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдерд╛ред
Rantime .NET SEH рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдмрдВрдзрд┐рдд рдЕрдкрд╡рд╛рджреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
- EXCEPTION_STACK_OVERFLOW -> рдХреНрд░реИрд╢
- EXCEPTION_ACCESS_VIOLATION -> AccessViolationException
- EXCEPTION_ACCESS_VIOLATION -> NullReferenceException
- EXCEPTION_INT_DIVIDE_BY_ZERO -> DivideByZeroException
- рдЕрдЬреНрдЮрд╛рдд SEH рдЕрдкрд╡рд╛рдж -> SEHException
рд╣рдо WinApi рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ SEH рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
[DllImport("kernel32.dll")] static extern void RaiseException(uint dwExceptionCode, uint dwExceptionFlags, uint nNumberOfArguments,IntPtr lpArguments);
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдереНрд░реЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди SEH рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред throw -> RaiseException(0xe0434f4d, ...)
рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╕реАрдПрд▓рдЖрд░-рдЕрдкрд╡рд╛рдж рдХреЛрдб рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддрд╛ рд╣реИредрд╡реАрдИрдПрдЪ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╣реИ, рдЬреЛ рдПрд╕рдИрдПрдЪ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдПрдХ рднреА рдереНрд░реЗрдб рдХреЗ рд╕реНрддрд░ рдкрд░ рдирд╣реАрдВред рдпрджрд┐ рдПрд╕рдИрдПрдЪ рд╢рдмреНрджрд╛рд░реНрдерд┐рдХ рд░реВрдк рд╕реЗ рдХреЛрд╢рд┐рд╢-рдХреИрдЪ рдХреЗ рд╕рдорд╛рди рд╣реИ, рддреЛ рд╡реАрдИрдПрдЪ рд╢рдмреНрджрд╛рд░реНрде рд░реВрдк рд╕реЗ рдПрдХ рдмрд╛рдзрд╛ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рдорд╛рди рд╣реИред рд╣рдо рдмрд╕ рдЕрдкрдирд╛ рд╣реИрдВрдбрд▓рд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡реАрдИрдПрдЪ рдХреА рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрд╕рдИрдПрдЪ рдЕрдкрд╡рд╛рдж рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡реЗрдХреНрдЯрд░ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рд░рдирдЯрд╛рдЗрдо рдХреЗ рдмреАрдЪ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ SEH рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓реЗрдВрдЧреЗ рдФрд░ рдЬрдм рдпрд╣ EXCEPTION_STACK_OVERFLOW рд╕реЗ рднрд┐рдбрд╝рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрджрд▓ рджреЗрдВ рддрд╛рдХрд┐ .NET рд░рдирдЯрд╛рдЗрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХреНрд░реИрд╢ рди рдХрд░реЗредрдЖрдк WinApi рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ VEH рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: [DllImport("kernel32.dll", SetLastError = true)] static extern IntPtr AddVectoredExceptionHandler(IntPtr FirstHandler, VECTORED_EXCEPTION_HANDLER VectoredHandler); delegate VEH PVECTORED_EXCEPTION_HANDLER(ref EXCEPTION_POINTERS exceptionPointers); public enum VEH : long { EXCEPTION_CONTINUE_SEARCH = 0, EXCEPTION_EXECUTE_HANDLER = 1, EXCEPTION_CONTINUE_EXECUTION = -1 } delegate VEH PVECTORED_EXCEPTION_HANDLER(ref EXCEPTION_POINTERS exceptionPointers); [StructLayout(LayoutKind.Sequential)] unsafe struct EXCEPTION_POINTERS { public EXCEPTION_RECORD* ExceptionRecord; public IntPtr Context; } delegate VEH PVECTORED_EXCEPTION_HANDLER(ref EXCEPTION_POINTERS exceptionPointers); [StructLayout(LayoutKind.Sequential)] unsafe struct EXCEPTION_RECORD { public uint ExceptionCode; ... }
рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рдордп рд╕рднреА рдкреНрд░реЛрд╕реЗрд╕рд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред рд╣рдо EXCEPTION_RECORD рдФрд░ рдЗрд╕рдореЗрдВ рдореМрдЬреВрдж рдПрдХреНрд╕рд╕реЗрдкреНрд╢рдирдХреЛрдб рдореЗрдВ рд░реБрдЪрд┐ рд▓реЗрдВрдЧреЗред рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЛрдб рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдПрд▓рдЖрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред рд╡реЗрдХреНрдЯрд░ рд╣реИрдВрдбрд▓рд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ: static unsafe VEH Handler(ref EXCEPTION_POINTERS e) { if (e.ExceptionRecord == null) return VEH. EXCEPTION_CONTINUE_SEARCH; var record = e. ExceptionRecord; if (record->ExceptionCode != ExceptionStackOverflow) return VEH. EXCEPTION_CONTINUE_SEARCH; record->ExceptionCode = 0x01234567; return VEH. EXCEPTION_EXECUTE_HANDLER; }
рдЕрдм рд╣рдо рдПрдХ рд░реИрдкрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╣реИрдВрдбрд▓реЗрд╢реЛ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╡реЗрдХреНрдЯрд░ рд╣реИрдВрдбрд▓рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдЬреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ StackOverflowException (рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╕реЗ рдЧрд┐рд░ рд╕рдХрддрд╛ рд╣реИ, WinA рдлрд╝рдВрдХреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╣реИрдВрдбрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡реЗрдХреНрдЯрд░ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ)ред HandleSO(() => InfiniteRecursion()) ; static T HandleSO<T>(Func<T> action) { Kernel32. AddVectoredExceptionHandler(IntPtr.Zero, Handler); Kernel32.SetThreadStackGuarantee(ref size); try { return action(); } catch (Exception e) when ((uint) Marshal. GetExceptionCode() == 0x01234567) {} return default(T); } HandleSO(() => InfiniteRecursion());
рдЗрд╕рдХреЗ рдЕрдВрджрд░, SetThreadStackGuarantee рд╡рд┐рдзрд┐ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ StackOverflow рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рд╕реНрдерд╛рди рд░рдЦрддрд╛ рд╣реИредрдЗрд╕ рддрд░рд╣, рд╣рдо рдЕрдирдВрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдЖрд╣реНрд╡рд╛рди рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реА рдзрд╛рд░рд╛ рдХрд╛рдо рдХрд░рддреА рд░рд╣реЗрдЧреА рдЬреИрд╕реЗ рдХрд┐ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реБрдЖ рдерд╛, рдЬреИрд╕реЗ рдХрд┐ рдХреЛрдИ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реБрдЖредрд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдПрдХ рд╣реА рдзрд╛рдЧреЗ рдореЗрдВ рджреЛ рдмрд╛рд░ рд╣реИрдВрдбрд▓ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? HandleSO(() => InfiniteRecursion()); HandleSO(() => InfiniteRecursion());
рдФрд░ рдПрдХ AccessViolationException рд╣реЛрдЧреАред рд╕реНрдЯреИрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╡рд╛рдкрд╕ред
рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИред рдвреЗрд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреГрд╖реНрда рд╣реИ рдЬрд┐рд╕реЗ рдЧрд╛рд░реНрдб рдкреГрд╖реНрда рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд╣рд▓реА рдмрд╛рд░ рдЬрдм рдпрд╣ рдкреГрд╖реНрда рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдФрд░ рдЕрдкрд╡рд╛рдж рд╣реЛрдЧрд╛ - STATUS_GUARD_PAGE_VIOLATION, рдФрд░ рдЧрд╛рд░реНрдб рдкреГрд╖реНрда рдзреНрд╡рдЬ рдкреГрд╖реНрда рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдк рдмрд╕ рдЗрд╕ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкреГрд╖реНрда рдЕрдм рд╕реНрдЯреИрдХ рдкрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рдЕрдЧрд▓реЗ рдУрд╡рд░рдлреНрд▓реЛ рдореЗрдВ, рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рд╕реНрдЯреИрдХ-рдкреЙрдЗрдВрдЯрд░ рд╕реНрдЯреИрдХ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рд╕реЗ рдкрд░реЗ рдЬрд╛рдПрдЧрд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдПрдХ AccessViolationException рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреАред рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ StackOverflow рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкреГрд╖реНрда рдХреЗ рдЭрдВрдбреЗ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╕реА рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА (msvcrt.dll) рд╕реЗ _resetstkoflw рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред [DllImport("msvcrt.dll")] static extern int _resetstkoflw();
рдЗрд╕реА рддрд░рд╣ рд╕реЗ, рдЖрдк рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд .NET рдХреЛрд░ рдореЗрдВ рдПрдХ AccessViolationException рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ рдЙрд╕ рдХреНрд░рдо рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╡реЗрдХреНрдЯрд░ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ .NET Core рднреА рдПрдХреНрд╕реЗрд╕рд╡рд┐рд▓реЗрдЬреЗрд╢рди рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп VEH рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред AddVectoredExceptionHandler рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЙрд╕ рдСрд░реНрдбрд░ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ: Kernel32.AddVectoredExceptionHandler(FirstHandler: (IntPtr) 1, handler);
рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдореБрджреНрджреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ:- рдЕрдкрд╡рд╛рдж рдЙрддрдиреЗ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИрдВ рдЬрд┐рддрдиреЗ рд╡реЗ рд▓рдЧрддреЗ рд╣реИрдВ;
- рд╕рднреА рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдПрдХ рд╣реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ;
- рдЧрд░реНрднрдкрд╛рдд рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрд░реЛрдВ рдкрд░ рдЕрдкрд╡рд╛рдж рдХреА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╣реЛрддреА рд╣реИ;
- рдЖрдк рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ .NET рд░рдирдЯрд╛рдЗрдо рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрдЪреНрдЫрд┐рдд рд╕реЗ рдЕрд▓рдЧ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдВрджрд░реНрдн
тЖТ рд░рд┐рдкреЛрд░реНрдЯ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рднрдВрдбрд╛рд░тЖТ - рдПрдбрдо Sitnik рджреНрд╡рд╛рд░рд╛ - Dotnext 2016 рдорд╛рд╕реНрдХреЛ рдЕрд╕рд╛рдзрд╛рд░рдг .NET рдореЗрдВ рдЕрдкрд╡рд╛рдж рд╣реИтЖТ DotNetBook: рдЕрдкрд╡рд╛рджтЖТ рдиреЗрдЯ рдЗрдирд╕рд╛рдЗрдб рдЖрдЙрдЯ рднрд╛рдЧ 8 - рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлрд╝реНрд▓реЛ рдореЗрдВ рд╕реА # VEH рд╕рд╛рде рдЕрдкрд╡рд╛рдж рд╣реИ рдЕрд╡рд░реЛрдзрди StackOverflow рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ -ред22-23 рдирд╡рдВрдмрд░ рдХреЛ, рдпреВрдЬреАрди DotNext 2018 рдорд╛рд╕реНрдХреЛ рдореЗрдВ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ "рд╕рд┐рд╕реНрдЯрдо рдореЗрдЯреНрд░рд┐рдХреНрд╕: рдХрд▓реЗрдХреНрдЯрд┐рдВрдЧ рдкрд┐рдЯреНрд╕ " рдХреЗ рд╕рд╛рде рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ ред рдЬреЗрдлрд░реА рд░рд┐рдХреНрдЯрд░, рдЧреНрд░реЗрдЧ рдпрдВрдЧ, тАЛтАЛрдкрд╛рд╡реЗрд▓ рдпреЛрд╕рд┐рдлреЛрд╡рд┐рдЪ рдФрд░ рдЕрдиреНрдп рд╕рдорд╛рди рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╡рдХреНрддрд╛ рдорд╛рд╕реНрдХреЛ рдореЗрдВ рдЖрдПрдВрдЧреЗред рд░рд┐рдкреЛрд░реНрдЯреЛрдВ рдХреЗ рд╡рд┐рд╖рдп рдпрд╣рд╛рдБ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ , рдФрд░ рдпрд╣рд╛рдБ рдЯрд┐рдХрдЯ рдЦрд░реАрдж рд╕рдХрддреЗ рд╣реИрдВ ред рдЕрдм рд╕рдореНрдорд┐рд▓рд┐рдд рд╣реЛрдВ!