.NET рдХреЛрд░: рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЛрдВ рдкрд░ x86_64 рдЖрдВрддрд░рд┐рдХ

рд╣рдо x86 рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдкреНрд░рднреБрддреНрд╡ рдХреЗ рдпреБрдЧ рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВред рд╕рднреА x86- рд╕рдВрдЧрдд рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рднреА рдереЛрдбрд╝реЗ рдЕрд▓рдЧ рд╣реИрдВред рдФрд░ рди рдХреЗрд╡рд▓ рдирд┐рд░реНрдорд╛рддрд╛, рдЖрд╡реГрддреНрддрд┐ рдФрд░ рдХреЛрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ред

рдЕрдкрдиреЗ рдЕрд╕реНрддрд┐рддреНрд╡ (рдФрд░ рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛) рдХреЗ рджреМрд░рд╛рди x86 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдиреЗ рдХрдИ рдкреНрд░рдореБрдЦ рдЕрдкрдбреЗрдЯ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 64 рдмрд┐рдЯреНрд╕ - x86_64 рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░) рдФрд░ "рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдирд┐рд░реНрджреЗрд╢ рд╕реЗрдЯ" рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рднреА рдкреНрд░реЛрд╕реЗрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдЗрд╕реЗ рднреА рдЗрд╕рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмреАрдЪ, рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдЙрдкрдпреЛрдЧреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢рддрд░рдВрдЬ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ , рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ : POPCNT, BSF / BSR (рдпрд╛ рдЕрдзрд┐рдХ рд╣рд╛рд▓ рдХреЗ рдПрдирд╛рд▓реЙрдЧ TZCNT / LZCNT ), PDEP, BSWAP, рдЖрджрд┐ред

рд╕реА рдФрд░ рд╕реА ++ рд╕рдВрдХрд▓рдХ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рдЙрдкрдпреЛрдЧ "рдЗрд╕ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред example1 example2

.NET рдФрд░ C # рдХреЗ рд▓рд┐рдП рдРрд╕реА рдХреЛрдИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рдереА, рдЗрд╕рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд░реИрдкрд░ рдмрдирд╛рдпрд╛, рдЬрд┐рд╕рдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╕реАрдкреАрдпреВ рдиреЗ рдЙрдирдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛, рддреЛ рдореИрдВрдиреЗ рдЙрдирдХреЗ рдХреЙрд▓ рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдореБрдЭреЗ рдЬрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрдВрддрд░рд┐рдХ рдЪреАрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ рдСрдкрдХреЛрдб рдХреЗ 5 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рд╡рд┐рд╡рд░рдг рд╣рдм рдкрд░ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рддрдм рд╕реЗ рдХрдИ рд╕рд╛рд▓ рдмреАрдд рдЪреБрдХреЗ рд╣реИрдВред .NET рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯреНрд░рд┐рдВрд╕рд┐рдХреНрд╕ рдХрднреА рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди .NET рдХреЛрд░ рд╕рд╛рдордиреЗ рдЖрдпрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдкрд╣рд▓реЗ рд╡реЗрдХреНрдЯрд░ рдирд┐рд░реНрджреЗрд╢ рдЖрдпрд╛, рдлрд┐рд░ рд▓рдЧрднрдЧ рдкреВрд░рд╛ * System.Runtime.Intrinsics.X86 рдХрд╛ рд╕реЗрдЯ ред
* - рдХреЛрдИ "рдЖрдЙрдЯрдбреЗрдЯреЗрдб" рдмреАрдПрд╕рдПрдл рдФрд░ рдмреАрдПрд╕рдЖрд░ рдирд╣реАрдВ рд╣реИрдВред

рдФрд░ рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣рдореЗрд╢рд╛ рднреНрд░рд╛рдордХ рд░рд╣реА рд╣реИ (рдХреБрдЫ рд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рддреБрд░рдВрдд рд╢рд╛рдорд┐рд▓ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдЭрдВрдбреЗ рд╣реИрдВ)ред рдЗрд╕рд▓рд┐рдП .NET рдХреЛрд░ рдиреЗ рд╣рдореЗрдВ рдЗрд╕ рддрдереНрдп рд╕реЗ рдФрд░ рднреА рднреНрд░рдорд┐рдд рдХрд░ рджрд┐рдпрд╛ рдХрд┐ "рдЕрдиреБрдордд" рд╕реЗрдЯ рдХреЗ рдмреАрдЪ рдХреБрдЫ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рднреА рд╣реИрдВред

рдпрд╣ рддрдм рд╕рд╛рдордиреЗ рдЖрдпрд╛ рдЬрдм рдореИрдВрдиреЗ рдХреЗрд╡реАрдПрдо рд╣рд╛рдЗрдкрд░рд╡рд┐рдЬрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдкрд░ рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА: рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЧрд┐рд░ рдЧрдИрдВ System.PlatformNotSupportedException: Operation is not supported on this platform at System.Runtime.Intrinsics.X86.Bmi1.X64.TrailingZeroCount(UInt64 value)ред рдЗрд╕реА рддрд░рд╣ System.Runtime.Intrinsics.X86.Popcnt.X64.PopCount рдХреЗ рд▓рд┐рдПред рд▓реЗрдХрд┐рди рдЕрдЧрд░ POPCNT рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рдЭрдВрдбрд╛ рд▓рдЧрд╛рдирд╛ рд╕рдВрднрд╡ рдерд╛, рддреЛ TZCNT рдиреЗ рдореБрдЭреЗ рдПрдХ рдореГрдд рдЕрдВрдд рдореЗрдВ рдкрд╣реБрдВрдЪрд╛ рджрд┐рдпрд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд┐рддреНрд░ рдореЗрдВ, рдЙрдкрдХрд░рдг рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдЬреЛ рдиреЗрдЯрдХреЛрд░ (рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреЛрдб рдФрд░ рдмрд╛рдЗрдирд░реА) рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреНрдЮрд╛рдд рд╕реАрдкреАрдпреВ-рдЬреЗрдб рдореЗрдВ рдЖрдВрддрд░рд┐рдХрддрд╛ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ:



рдФрд░ рдпрд╣рд╛рдВ рд╕реАрдкреАрдпреВрдЖрдИрдбреА рд╕реЗ рдПрдордПрд╕рдбреАрдПрди рдкреГрд╖реНрда рд╕реЗ рд▓рд┐рдП рдЧрдП рдЯреВрд▓ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ :



рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рд░рд┐рдкреЛрд░реНрдЯ рд╕рдм рдХреБрдЫ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдиреБрджреЗрд╢ Intrinsics.X86.Bmi1.X64.TrailingZeroCountрдЕрднреА рднреА рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рд╛рде рдЧрд┐рд░рддрд╛ рд░рд╣рд╛ System.PlatformNotSupportedExceptionред

рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ NETCore рдХреА рдЖрдВрдЦреЛрдВ рд╕реЗ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЧрд┐рддреБрдм рдкрд░ рдХреМрди рд╕реЗ рд╕реНрд░реЛрдд рдЭреВрда рдмреЛрд▓рддреЗ рд╣реИрдВред рдЪрд▓реЛ рд╡рд╣рд╛рдБ рдХрд╛рдорджреЗрд╡ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рдЬрд╛рддреЗ рд╣реИрдВред EEJitManager::SetCpuInfo()

рдЗрд╕рдореЗрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдиреЗрд╕реНрдЯреЗрдб рд╣реИрдВред рдореИрдВрдиреЗ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЦрд╛рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рдХреБрдЫ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдФрд░ рдПрдХ рдкреВрд░реА рдЕрд╕реЗрдВрдмрд▓рд░ рдлрд╝рд╛рдЗрд▓ ( рдХреИрд╕реЗ рдПрдХ рдирдП рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдПрдПрд╕рдПрдо рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП ) рдХреЛ рдЪреБрдирдирд╛ рдкрдбрд╝рд╛ ред рдирд┐рд╖реНрдкрд╛рджрди рдкрд░рд┐рдгрд╛рдо:



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдзреНрд╡рдЬ InstructionSet_BMI1рдЕрднреА рднреА рд╕реЗрдЯ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреБрдЫ рдЕрдиреНрдп рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИрдВ)ред

рдпрджрд┐ рдЖрдк рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЗрд╕ рдзреНрд╡рдЬ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рдХреЛрдб рдореЗрдВ рдЖ рд╕рдХрддреЗ рд╣реИрдВ :

if (resultflags.HasInstructionSet(InstructionSet_BMI1) && !resultflags.HasInstructionSet(InstructionSet_AVX))
    resultflags.RemoveInstructionSet(InstructionSet_BMI1);

рддреЛ, рд╡рд╣ рд╣рдорд╛рд░реА рд▓рдд рд╣реИ! рдпрджрд┐ AVX рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ BMI1 (рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рд╕реЗрдЯ) рдЕрдХреНрд╖рдо рд╣реИред рдХреНрдпрд╛ рддрд░реНрдХ рд╣реИ, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЕрднреА рддрдХ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдореМрдЬреВрдж рд╣реИред рдЕрдм рдпрд╣ рд╕рдордЭрдирд╛ рдмрд╛рдХреА рд╣реИ рдХрд┐ рд╕реАрдкреАрдпреВ-рдЬреЗрдб рдФрд░ рдЕрдиреНрдп рдЙрдкрдХрд░рдг рдПрд╡реАрдПрдХреНрд╕ рдХреЛ рдХреНрдпреЛрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдиреЗрдЯрдХреЛрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рд╣рдорд╛рд░реЗ рдЯреВрд▓ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХреИрд╕реЗ рдЕрд▓рдЧ рд╣реИ:

>diff a b
7c7,8
< Test ((buffer[8] & 0x02) != 0) -> 0
---
> Test ((buffer[8] & 0x02) != 0) -> 1
> ==> Set InstructionSet_PCLMULQDQ
18c19,32
< Test ((buffer[11] & 0x18) == 0x18) -> 0
---
> Test ((buffer[11] & 0x18) == 0x18) -> 1
> Test (hMod == NULL) -> 0
> Test (pfnGetEnabledXStateFeatures == NULL) -> 0
> Test ((FeatureMask & XSTATE_MASK_AVX) == 0) -> 0
> Test (DoesOSSupportAVX() && (xmmYmmStateSupport() == 1)) -> 1
> Test (hMod == NULL) -> 0
> Test (pfnGetEnabledXStateFeatures == NULL) -> 0
> Test ((FeatureMask & XSTATE_MASK_AVX) == 0) -> 0
> ==> Set InstructionSet_AVX
> Test ((buffer[9] & 0x10) != 0) -> 1
> ==> Set InstructionSet_FMA
> Test (maxCpuId >= 0x07) -> 1
> Test ((buffer[4] & 0x20) != 0) -> 1
> ==> Set InstructionSet_AVX2

  1. рдЪреЗрдХ рдмрдлрд╝рд░ [8] рдФрд░ 0x02 рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рдпрд╣ PCLMULQDQ рд╣реИ
  2. рдмрдлрд░ [11] рдФрд░ 0x18 рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рдпрд╣ AVX рдФрд░ OSXSAVE рд╣реИ, AVX рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реЗрдЯ рд╣реИ (CPU-Z рдпрд╣ рджреЗрдЦрддрд╛ рд╣реИ), OSXSAVE рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
  3. рдФрд░ рдЗрд╕рдХреЗ рдкреАрдЫреЗ рдЕрдиреНрдп рдЬрд╛рдВрдЪ рд╣реИрдВ рдЬреЛ InstructionSet_AVX рдзреНрд╡рдЬ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░рддреА рд╣реИрдВ

рддреЛ рд╡рд╛рдпрд░рд▓ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ, рддреЛ libvirt.cpu_mode рдХреЛ рд╣реЛрд╕реНрдЯ-рдкрд╕реНрд╢рд░рде рдпрд╛ рд╣реЛрд╕реНрдЯ-рдореЙрдбрд▓ рдореЗрдВ рд░рдЦрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ ред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рд╕реЗ рд╕рднреА рд╕реВрдк рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ ssse3, sse4.1, sse4.2, sse4a, popcnt, abm, bmi1, bmi2, avx, avx2, osxsave, xsave, pclmulqdqред рдпрд╣рд╛рдВ рдореИрдВ рдирдорд╕реНрддреЗ рдХрд╣рддрд╛ рд╣реВрдВ рдФрд░ рдзрдиреНрдпрд╡рд╛рдж рджреЗрддрд╛ рд╣реВрдВvdsina_m;)

рдФрд░ рдЖрдк рдЕрдиреБрджреЗрд╢ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдореЗрдЬрдмрд╛рди рдпрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдЯреВрд▓ рдХреА рдорджрдж рд╕реЗ .NET рдХреЛрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рджреЗрдЦрддрд╛ рд╣реИ: (рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЬрд╝рд┐рдк, рдореИрдВ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдЧреАрдердм рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛)ред


All Articles