рдПрдХ рдкреНрд░рдмрдВрдзрд┐рдд рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдорд┐рдиреАрдбрдВрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, DbgHelp.dll рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред WinForms рдкрд░ рддреИрдпрд╛рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЗрд╕рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рд╣рдо рдорд┐рдирд┐рдбрдкрдВрдк рдмрдирд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ рдЕрдирд╣реЗрд▓реНрдб рдЕрдкрд╡рд╛рдж рд╣реЛрдиреЗ рдкрд░ рдорд┐рдиреАрдбрдВрдк рдмрдирд╛рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдЬрдм рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рджреГрд╢реНрдп рдХреЛ рджрдмрд╛рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рд╢реВрдиреНрдп рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВрдЧреЗ:
private void button1_Click_1(object sender, EventArgs e) { int a = 3; int b = 0; int c = a / b; }
рдЕрдм рд╣рдо рдЙрди рддрдВрддреНрд░реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдбреЗрд╡рд▓рдкрд░ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рджреЛ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:
AppDomain.CurrentDomain.UnhandledException Application.ThreadException
рдереНрд░реЗрдбрдПрдХреНрд╕рд╕реЗрдкреНрд╢рди рдЖрдорддреМрд░ рдкрд░ UI рдереНрд░реЗрдбреНрд╕ (рдЬреИрд╕реЗ рдХрд┐ WinForms рдИрд╡реЗрдВрдЯ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рдЕрдиреНрдп рд╕рднреА рдЕрдЦрдВрдбрд┐рдд рдЕрдкрд╡рд╛рдж рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд░реЛрдХрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХреЗ рдХрд╛рдо рдХреЗ рдЕрдВрддрд┐рдо рдкреВрд░рд╛ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреБрдЫ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЛ рдмрдЪрд╛рдПрдВ, рдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИ, рд╣рд╛рд░реНрдб рдбрд┐рд╕реНрдХ рдорд┐рдиреАрдбрдореНрдк рдкрд░ рд▓рд┐рдЦреЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, UnhandledException рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╕рднреА рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ UnhandledException рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдореБрдЦреНрдп () рдореЗрдВ Application.Run (рдирдпрд╛ рдлреЙрд░реНрдо 1) рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╣рд▓реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, ThreadException рд╣рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рджреЗрддреА рд╣реИред
DbgHelp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рд╕рднреА рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпрд╛рдБ рдПрдХ DumpMaker рд╡рд░реНрдЧ рдореЗрдВ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рдзрд┐ рд╣реЛрдЧреА:
public static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
рдпрд╣ рд╡рд╣ рд╡рд┐рдзрд┐ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо UnhandledException рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВрдЧреЗ:
AppDomain.CurrentDomain.UnhandledException += DumpMaker.CurrentDomain_UnhandledException;
рдЕрдм рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдорд╛рд░реЗ рддрд░реАрдХреЗ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред
рдбрдВрдкрдореЗрдХрд░ рдХреНрд▓рд╛рд╕ рдХрдВрдЯреЗрдВрдЯ private static class MINIDUMP_TYPE { public const int MiniDumpNormal = 0x00000000; ... public const int MiniDumpWithCodeSegs = 0x00002000; }
MINIDUMP_TYPE рдореЗрдВ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд┐рдиреАрдкрдВрдк рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рдкреВрд░реА рд╕реВрдЪреА
рд╕рд╛рдЗрдЯ рдкрд░ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред
[StructLayout(LayoutKind.Sequential, Pack = 4)] public struct MINIDUMP_EXCEPTION_INFORMATION { public uint ThreadId; public IntPtr ExceptionPointers; public int ClientPointers; }
MINIDUMP_EXCEPTION_INFORMATION - рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдЬреЛ рдЕрдкрд╡рд╛рдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧреА, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдиреЗ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд┐рдпрд╛ред
[DllImport("kernel32.dll")] static extern uint GetCurrentThreadId();
рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЖрдИрдбреА рд▓реМрдЯрд╛рддрд╛ рд╣реИред
[DllImport("Dbghelp.dll")] static extern bool MiniDumpWriteDump(IntPtr hProcess, uint ProcessId, IntPtr hFile, int DumpType, ref MINIDUMP_EXCEPTION_INFORMATION ExceptionParam, IntPtr UserStreamParam, IntPtr CallbackParam);
рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рдзрд┐ рдЬреЛ рд╕реАрдзреЗ рдбрдВрдк рдирд┐рд░реНрдорд╛рдг рдФрд░ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХрд░рддреА рд╣реИред рдЗрд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рд╕реЗ рдкреБрдХрд╛рд░рд╛ рдЬрд╛рддрд╛ рд╣реИ
private static void CreateMiniDump() { using (System.Diagnostics.Process process = System.Diagnostics.Process.GetCurrentProcess()) { string FileName = string.Format(@"CRASH_DUMP_{0}_{1}.dmp", DateTime.Today.ToShortDateString(), DateTime.Now.Ticks); MINIDUMP_EXCEPTION_INFORMATION Mdinfo = new MINIDUMP_EXCEPTION_INFORMATION(); Mdinfo.ThreadId = GetCurrentThreadId(); Mdinfo.ExceptionPointers = Marshal.GetExceptionPointers(); Mdinfo.ClientPointers = 1; using (FileStream fs = new FileStream(FileName, FileMode.Create)) { { MiniDumpWriteDump(process.Handle,(uint)process.Id, fs.SafeFileHandle.DangerousGetHandle(), MINIDUMP_TYPE.MiniDumpNormal, ref Mdinfo, IntPtr.Zero, IntPtr.Zero); } } } }
рдбрдВрдк рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо (FileName) рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЙрд╕реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХреНрд╕рд╛рдИ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред MiniDumpWriteDump рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, MINIDUMP_EXCEPTION_INFORMATION рдЯрд╛рдЗрдк рдХрд░реЗрдВред
рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕реВрдЪреА рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ MiniDumpWriteDumpред
hProcess - рдЙрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдирд╛ рдЙрддреНрдкрдиреНрди рдХреА рдЬрд╛рддреА рд╣реИ
ProcessID - рдЙрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЖрдИрдбреА рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдирд╛ рдЙрддреНрдкрдиреНрди рдХреА рдЬрд╛рддреА рд╣реИ
hFile - рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░
DumpType - рдбрдВрдк рдкреНрд░рдХрд╛рд░ (рд╣рдо
MiniDumpNormal рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ)
рдЕрдкрд╡рд╛рдж Param - рдЕрдкрд╡рд╛рдж рдЬрд╛рдирдХрд╛рд░реА
UserStreamParam - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЬрд╛рдирдХрд╛рд░реАред рд╣рдо рдЗрд╕реЗ рдбрдВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ IntPtr.Zero рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ
CallbackParam - рдХреЙрд▓рдмреИрдХ рдЬрд╛рдирдХрд╛рд░реАред рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
CreateMiniDump рдкрджреНрдзрддрд┐ рдХреЛ CurrentDomain_UnhandledException рд╕реЗ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддреЗ рд╣реБрдП рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖ рд╣реИ:
public static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { System.Windows.Forms.MessageBox.Show("Unhandled exception!"); CreateMiniDump(); }
рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдПрдВ
рдЖрдЗрдП рдЗрдХрдЯреНрдареЗ рдПрдХреНрд╕-рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЪрд▓рд╛рдХрд░ рдФрд░ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдХрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ:

рдбрдВрдк рдЪрд▓рд╛рдУ
рд╣рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди .dmp рдХреЗ рд╕рд╛рде рдПрдХ рдбрдВрдк рдорд┐рд▓рд╛ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, VisualStudio рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдПрдХ рд╕рдорд╛рди рдореЗрдиреВ рд╡рд┐рдВрдбреЛ рдХреЗ рджрд╛рдИрдВ рдУрд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЖрдИрдПрд▓ рдХреЛрдб рдФрд░ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ, рдЖрдкрдХреЛ рдкреНрд░рддреАрдХ рдкрде - рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреА рдкреАрдбреАрдмреА рдлрд╛рдЗрд▓реЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред Pdb рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбреАрдмрдЧрд┐рдВрдЧ рдбреЗрдЯрд╛ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реНрдерд┐рддрд┐ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЦреЛрдЬ рдХреА рдЧрдИ рдлрд╛рдЗрд▓реЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реЛрддреА рд╣реИрдВред

рдЕрдЧрд▓рд╛, рдорд┐рд╢реНрд░рд┐рдд рдХреЗ рд╕рд╛рде рдбрд┐рдмрдЧ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рд╣рдо рдбрд┐рдмрдЧрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдкрддрди рдХреЗ рд╕рдордп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рджреЗрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрд╡рд╛рдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рднреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛
1.
рд╕реНрдЯреИрдХрдУрд╡рд░рдлрд╝реНрд▓реЛ2.
рдХреНрд░реИрд╢ рдорд┐рдиреАрдбрдореНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛3.
Howto: C # рдХреНрд░реИрд╢ рдкрд░ рдбрдВрдк рдлрд╝рд╛рдЗрд▓ рдЬрдирд░реЗрдЯ рдХрд░реЗрдВ4.
рд╕реА # рдореЗрдВ рд▓реЗрдЦрди
рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ
рдПред рдлреЗрдбреЛрд╕рд┐рди