рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ: рджреВрд╕рд░реЗ рдереНрд░реЗрдб рдореЗрдВ рд░реЗрдлрд┐рдВрдЧ

рдкреНрд░рд╢реНрди рдореЗрд░реЗ рд╕рд╛рде рдХрднреА рдирд╣реАрдВ рд╣реБрдЖ: " рд▓рд┐рдВрдХ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдХреИрд╕реЗ рд╕рд╣реЗрдЬрдирд╛ / рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИ? " рддрд╛рд░реНрдХрд┐рдХ рдзрд╛рд░рдгрд╛ рдпрд╣ рд╣реИ рдХрд┐ тАЬрдореИрдВ рд╡рд┐рдзрд┐ рдХреЛ рд░реЗрдл рдкрд╛рд╕ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЙрд╕реЗ рдмрдЪрд╛рдКрдВрдЧрд╛ред рд░реБрдХ рдЬрд╛рдУ, рдУрд╣ рд╢рд┐ ~ред " рд╣рд╛рдВ, Refs рд╕рд╣реЗрдЬреЗ рдирд╣реАрдВ рдЧрдП рд╣реИрдВ (рдФрд░ рдлрд┐рд░ рднреА, рдЖрдк рдЙрди рдкрд░ рдХреНрд▓реЛрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдРрд╕реА рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдирд╛ рдФрд░ рдЗрд╕рд╕реЗ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдирд╛ рднреА рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛)ред рд▓реЗрдХрд┐рди рдЖрдк рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреАрд╡рд░реНрдб __makeref рдХреЗ рд╕рд╛рде TypedReference рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдХрд╛рд╢, TypedReference рд╕реАрдзреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ System.Object рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рднреА рдЕрд╕рдВрднрд╡ рд╣реИ (рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдЧреБрдЪреНрдЫрд╛ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдпрд╣ рдПрдХ рдореГрдд рдЕрдВрдд рдкреНрд░рддреАрдд рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИ - рд╡рд╣рд╛рдБ рдЕрднреА рднреА рдПрдХ RuntimeArgumentHandle рд╣реИ, рдЬрд┐рд╕рдореЗрдВ TypedReference рдЧреБрдг рд╣реИрдВ, рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде - System.Object рдореЗрдВ рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рдбрд╛рд▓реА рдХреЗ рдмрд╛рдж, рдЖрдк рдЕрднреА рднреА рдЗрд╕реЗ рддрдм рддрдХ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдЬрд┐рд╕ рд╕реНрдЯреИрдХ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рд╡рд╣ рдЬреАрд╡рд┐рдд рд╣реИред рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред


TypedReference


TypedReference рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдЕрджреНрднреБрдд рдЫреЛрдЯреА рдЪреАрдЬрд╝ рд╣реИ - рдЖрдк рдЗрд╕рдореЗрдВ Ref рдХреЛ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреВрд╕рд░реА рд╡рд┐рдзрд┐ (рдпрд╛рдиреА, рдПрдХ рд╡рд┐рдзрд┐ рд╕реЗ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ ref 'ohm рд╣реИ) рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рддрд░реАрдХреЗ рд╣рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ - NotSupportedException рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдо рдЙрдЪрд┐рдд рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ - __refvalue рдХреАрд╡рд░реНрдб рд╣реИ, рдЬреЛ рди рдХреЗрд╡рд▓ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдЬреАрдм рд▓рдЧ рд░рд╣рд╛ рд╣реИ:

void Out(ref int someInt) { Input(__makeref(someInt)); } void Input(TypedReference @ref) { int val = __refvalue(@ref, int);//  __refvalue(@ref, int) = 0;//   someInt } 


рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдкреНрд░рдХрд╛рд░ рд╣реИрдВрдбрд▓ рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдЗрдВрдЯ - рдЯрд╛рдЗрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛ рд╕рддреНрдпрд╛рдкрди рдлрд┐рд░ рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рд╕рдм рд╣реИ, рдЯрд╛рдЗрдк-рд░реЗрдлрд░реЗрдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╛ рддреЛ рдмрдВрдж рдХрд░рдиреЗ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЗрд╕рд▓рд┐рдП рдЯрд╛рдЗрдкрд░рд╛рдЗрдЯрд░ рдкрд░ рдХреНрд▓реЛрдЬрд░ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

RuntimeArgumentHandle


рдпрд╣ рдХреЗрд╡рд▓ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдореЗрдВ, рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ TypedReference рдХреА рд╕реВрдЪреА рд╣реИ (рдЬрд┐рд╕ рддрдХ ArgIterator рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдХреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ ... рдореБрдЭреЗ рдпрд╣ рднреА рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХреИрд╕реЗ рдХрд░реЗрдВ:

 void Out(int something) { Input(__arglist(something)); } void Input(__arglist) { new ArgIterator(__arglist); } 


рдЙрд╕реА рд╕рдордп, __arglist рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╡реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди RuntimeArgumentHandle рд╕рдВрднрд╡ рд╣реИ (рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, TypedReference рдФрд░ RuntimeArgumentHandle рдХреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред __arglist () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдиреЗ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди __arlist рдХреЛ рд╕рдВрднрд╡ рд╣реИред рдХреБрдЫ рд╣рдж рддрдХ рдЕрд╕реНрдкрд╖реНрдЯ рд╢рдмреНрдж рдХрд╛ рдЕрд░реНрде рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ:

 delegate void ArgWarrior(RuntimeArgumentHandle argh); void Out(int something) { (new ArgWarrior(u => { } ))(__arglist(someting));//  Input(new ArgWarrior(u => { } ), __arglist(someting); } void Input(ArgWarrior argh, __arglist) { argh(__arglist);//   } 


рдФрд░ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕ рдорд╛рд░реНрд▓реЗрдЬрд╝реЛрди рдмреИрд▓реЗ рдХреЗ рдкреНрд░рдореБрдЦ рдмрд┐рдВрджреБ рдкрд░ рдорд┐рд▓рд╛: рдкреНрд░рддрд┐рдирд┐рдзрд┐ред

рдПрдХ рддрд░рд╣ рд╕реЗ рдЕрддрд┐ рд╕реБрдВрджрд░ рдореЙрдХрд┐рдВрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ _methodPtrAux рдХрд╛ рд╣реЗрд░рдлреЗрд░


_methodPtrAux рдХрд┐рд╕реА рднреА рдкреНрд░рддреНрдпрд╛рдпрд┐рдд рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЪреМрдерд╛ рдХреНрд╖реЗрддреНрд░ рд╣реИ, рдЬреЛ рдпрд╣рд╛рдБ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рдПрдЧрд╛ред рдХреНрдпрд╛ рдХрд╣рдирд╛ рд╣реИ? рд▓рдмреНрдмреЛрд▓реБрдЖрдм рдпрд╣ рд╣реИ рдХрд┐ _methodPtrAux рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд┐рдЯ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдЙрд╕ рд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╛рдд рдирд╣реАрдВ рд╣реИред рдкреНрд░рддрд┐рдирд┐рдзрд┐ _methodPtrAux рдХрд╛ рдорд╛рди рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд░рд╣рддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдЗрд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рдпрдВрддреНрд░рдг рдареАрдХ рдЙрд╕реА рд╕реНрдерд╛рди рдкрд░ рдЬрд╛рдПрдЧрд╛ рдЬрд╣рд╛рдВ рдЗрд╕ рдлрд╝реАрд▓реНрдб рдХрд╛ рдорд╛рди рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд┐рднрд┐рдиреНрди рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рджреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реЛрдиреЗ рдкрд░, рдореИрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╕реЗ рд╕реВрдЪрдХ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдкреНрд░рддрд┐рдирд┐рдзрд┐ b рд╕реЗ рд╕реВрдЪрдХ рдХреЗ рд╕рд╛рдеред рднрд▓реЗ рд╣реА рдЙрдирдХреЗ рдкрд╛рд╕ рддрд░реНрдХ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рд╕реЗрдЯ рд╣реЛ, рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рддрд░реНрдХреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдиреЗ рдкрд░ рднреА, clr рдЕрд▓рд╛рд░реНрдо рдирд╣реАрдВ рдмрдЬрд╛рдПрдЧрд╛ - int рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ , рд╕рднреА рдЗрдЪреНрдЫрд╛рдПрдВ рдкреВрд░реА рд╣реЛ рдЬрд╛рдПрдВрдЧреА, рдХреЛрдИ рднреА рдирд╛рд░рд╛рдЬ рдирд╣реАрдВ рд╣реЛрдЧрд╛ , рдпрд╛ ... RuntimeArgumentHolle рдХреЛ System.Object рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

  delegate void Encast(RuntimeArgumentHandle @ref); delegate void Uncast(object @object); static void UseWith(Encast en, __arglist) { en(__arglist); } static object m_storedRef; static void Engage(ref object @object) { Encast en = new Encast(@ref => { }); Uncast un = new Uncast(o => { m_storedRef = o;//     <b>en</b>. }); typeof(Encast).GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)[3].SetValue(en, typeof(Uncast).GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)[3].GetValue(un));//   en UseWith(en, __arglist(__makeref(@object))); // } 


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

рдЙрд▓рдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЗрд╕реА рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдЯреИрдХ рдлреНрд░реЗрдо рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдореЙрдирд┐рдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  static object m_locker = new object(); //... Monitor.Enter(m_locker); Monitor.Exit(m_locker); 


m_locker рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдФрд░ рдзрд╛рдЧреЗ рд╕реЗ рдЕрд╡рд░реБрджреНрдз рд╣реИ, рдЗрд╕рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рд░реЛрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред RuntimeArgumentHandle рдмрд┐рдирд╛ рдмреНрд░реЗрдХ рдХреЗ рд╕реНрдЯреИрдХ рдкрд░ рдмрдиреА рд╣реБрдИ рд╣реИред
рдкреВрд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ThreadJiggler { class Program { delegate void Encast(RuntimeArgumentHandle @ref); delegate void Uncast(object @object); static object m_storedRef; static object m_locker = new object(); static bool m_useFlag; static void Main(string[] args) { object @v = "means \"vendetta\""; Victim1(ref @v); Console.WriteLine(@v); } static void UseWith(Encast en, __arglist) { en(__arglist); } static Thread m_someThread; static void Victim1(ref object @object) { Thread t = new Thread(() => { Monitor.Enter(m_locker); { for (; !m_useFlag; ) { Thread.Sleep(10); } Encast en = new Encast(@ref => { TypedReference tr = new ArgIterator(@ref).GetNextArg(); __refvalue( tr, object) = 0; }); Uncast un = new Uncast(o => { m_storedRef = o; }); typeof(Uncast).GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)[3].SetValue(un, typeof(Encast).GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)[3].GetValue(en)); un(m_storedRef); } Monitor.Exit(m_locker); }); t.IsBackground = false; t.Start(); { Encast en = new Encast(@ref => { }); Uncast un = new Uncast(o => { m_storedRef = o; m_useFlag = true; Monitor.Enter(m_locker); Monitor.Exit(m_locker); }); typeof(Encast).GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)[3].SetValue(en, typeof(Uncast).GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)[3].GetValue(un)); UseWith(en, __arglist(__makeref(@object))); } } } } 


рдореЗрди рдХреЗ рдЕрдВрдд рдореЗрдВ , рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ @v рдХрд╛ рдорд╛рди 0 рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред

Source: https://habr.com/ru/post/In192140/


All Articles