.Net рдкрд░ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ

.Net рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ:

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд░рд┐рдлреНрд▓реЗрдХреНрд╢рди рдПрдорд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдЬрдирд░реЗрд╢рди рддрдХрдиреАрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдкреАрдврд╝реА рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░


рдкрд╣рд▓реА .net рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рд▓рд┐рдП CIL рдХреЛрдб рдХреА рдкреНрд░рддреНрдпрдХреНрд╖ рдкреАрдврд╝реА (рдЬрд┐рд╕реЗ MSIL рдпрд╛ рдХреЗрд╡рд▓ IL рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ) рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрддреНрдкрдиреНрди рдХреЛрдб рд╕реАрдЖрдИрдПрд▓ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдЬреЛ рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реНрдЯреЗрд░реЙрдпрдб рдкрд░ рдХреЛрдбрд╛рдВрддрд░рдХ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рдЖрдкрдХреЛ рдбрд╛рдпрдиреЗрдорд┐рдХ рдХреНрд▓рд╛рд╕реЗрд╕ рдФрд░ рдореЗрдердбреНрд╕ рдпрд╛ "рдирдВрдЧреЗ" рдбрд╛рдпрдирд╛рдорд┐рдХ рдореЗрдердб рдХреЗ рд╕рд╛рде рдПрдХ рдбрд╛рдпрдирд╛рдорд┐рдХ рдЕрд╕реЗрдВрдмрд▓реА (рдбрд┐рд╕реНрдХ рдореЗрдВ рдЗрд╕реЗ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде) рдорд┐рд▓рддреА рд╣реИред рдлрд┐рд░ рдЕрдкрдиреЗ рд╡рд┐рд╡реЗрдХ рдкрд░ рдЙрддреНрдкрдиреНрди рдЕрдЪреНрдЫреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рджреВрд╕рд░рд╛ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, C # рдпрд╛ VB) рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдкреАрдврд╝реА рд╣реИ, рдФрд░ рдлрд┐рд░ CIL рдореЗрдВ рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдмрд╛рдж рдХрд╛ рд╕рдВрдХрд▓рди рд╣реИред рдЖрдЙрдЯрдкреБрдЯ рдЕрд╕реЗрдВрдмрд▓реА рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдЕрд╕реЗрдВрдмрд▓реА рд╣реИред
рддреАрд╕рд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЯреНрд░реА рджреГрд╢реНрдп рд╕реЗ рдкреАрдврд╝реА рд╣реИред рдЖрдк рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХреБрдЫ рдПрдПрд╕рдбреА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╡рд╣реА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдПрдПрд╕рдбреА (рдПрдПрд╕рдЯреА) рдХреЗ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддреЗ рд╣реБрдП, рдЕрдкрдиреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рддреБрд░рдВрдд рд╕реАрдЖрдИрдПрд▓ рдХреЛрдб рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЯреНрд░реА рдЕрдкрдиреА рдХреНрд╖рдорддрд╛рдУрдВ рдореЗрдВ рд╕реАрдорд┐рдд рд╣реИ - рдЖрдк рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рддрджрдиреБрд╕рд╛рд░, рдЙрдиреНрд╣реЗрдВ рдбрд┐рд╕реНрдХ рдкрд░ рд╕рд╣реЗрдЬреЗрдВред

рд╣рдо рдЬрдирдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗ


CIL рдореЗрдВ рдХреНрдпреЛрдВ, рдФрд░ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛ рдореЗрдВ рдирд╣реАрдВ? CIL рдореЗрдВ рдЬрдирд░реЗрд╢рди рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛ рдореЗрдВ рдЬрдирд░реЗрд╢рди рдХрд╛ рдорддрд▓рдм рдЗрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдмрдирд╛рдирд╛ рдФрд░ рдлрд┐рд░ CIL рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдКрдкрд░реА рд╕реНрддрд░ рдХреА рднрд╛рд╖рд╛ рдореЗрдВ рдкреАрдврд╝реА рдХреЛ рдмрд╛рд╣рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ - рд╕рдВрдХрд▓рдХ рдХреА рднрд╛рдЧреАрджрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдФрд░ рдлрд┐рд░ рднреА - рдпрд╣ рдПрдХ .net рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдХреЗ рд╕рд╛рде рдмреЗрд▓рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рджреБрд░реНрд▓рдн рдЕрд╡рд╕рд░ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛ рдореЗрдВ рдкреАрдврд╝реА рдХреЗ рдЕрдкрдиреЗ рдлрд╛рдпрджреЗ рд╣реИрдВ: CIL рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдк рдПрдХ рдкрд░рд┐рдЪрд┐рдд рднрд╛рд╖рд╛ рдореЗрдВ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдРрд╕реА рдХреЛрдб рдкреАрдврд╝реА рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рд▓реЙрдЧ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдбрдВрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЖрдВрдЦ рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдпрд╛ рдЖрдИрдбреАрдИ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдбреАрдмрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ


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

рдкрд░реНрдпрд╛рдкреНрдд рд╢рдмреНрдж, рдЖрдЗрдП рдЬрдирд░реЗрдЯ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ


рд╕реМ рдмрд╛рд░ рд╕реБрдирдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдмрд╛рд░ рджреЗрдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░ - рдкрдЯреНрдЯреЗ рдкрд░ред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╢рдмреНрдж рд╣реИрдВ, рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред
рдХрд╛рд░реНрдп рдХреЛ рдРрд╕рд╛ рд╣реЛрдиреЗ рджреЗрдВ: рдХреБрдЫ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдПрдХ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рджреВрд╕рд░реЛрдВ рдореЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред рдпрд╛рдиреА рдРрд╕реА рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдкрддреНрддрд┐ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рдеред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
public class TestSrc { public int SomeID { get; set; } } public class TestTarg { public double SomeOtherID { get; set; } } 

рд╣рдореЗрдВ TestSrc рдХреЛ TestTarg рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдорд╛рд░реЗ рдХрдиреНрд╡рд░реНрдЯрд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рджреЗрдЦреЗрдВ:
 class Mapper<TIn, TOut> { protected delegate TOut MapMethod(TIn src); public TOut Map(TIn source) {...} private MapMethod GenerateMapMethod(IDictionary<string, string> mapping) {...} } 

рдореИрдк рд╡рд┐рдзрд┐ GenerateMapMethod рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкрд╣рд▓реЗ рдХреЙрд▓ рдкрд░ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╡рд┐рдзрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИ, рдФрд░ рдмрд╛рдж рдХреА рдХреЙрд▓ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред рдореИрдкрд┐рдВрдЧ, рдЬрд┐рд╕реЗ рд╣рдо GenerateMapMethod рдХреЗ рдЗрдирдкреБрдЯ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рд╕рдВрд╕реНрдерд╛рдУрдВ рдореЗрдВ рдлрд╝реАрд▓реНрдбреНрд╕ рдХрд╛ рдкрддреНрд░рд╛рдЪрд╛рд░ рд╣реИ (рдХреБрдВрдЬреА рдЯрд╛рдЗрдк TIn рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо рд╣реИ, рдорд╛рди рдЯрд╛рдЗрдк рдЯреВ рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо рд╣реИ)ред

рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рдзрд╛рдирд╕рднрд╛

рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рд╣рдорд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдХрд╣рд╛рдВ рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛? рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ - рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ рдпрд╛ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рдзрд┐ рдореЗрдВред рд╡рд╣ рджреЛрдиреЛрдВ, рдФрд░ рджреВрд╕рд░рд╛ "рдлреНрд▓рд╛рдИ рдкрд░" рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдбрд╛рдпрдиреЗрдорд┐рдХ рдЕрд╕реЗрдВрдмрд▓реА рдПрдХ рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░реАрдХреЗ рдХреЗ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдбрд╛рдпрдиреЗрдорд┐рдХ рдЕрд╕реЗрдВрдмрд▓реА рдХрд╛ рдПрдХ рдФрд░ рдкреНрд▓рд╕ рдмрд╛рдж рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд╣рд╛рдВ рдЙрддреНрдкрдиреНрди рдХрд┐рдП рдЧрдП рдЙрдкрдпреЛрдЧ рдпрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдмрдЪрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИред
рддреЛ, рдПрдХ рд╡рд░реНрдЧ рдФрд░ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдмрдирд╛рдПрдВ:
 protected MapMethod GenerateMapMethod(IDictionary<string, string> mapping) { var dynGeneratorHostAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly( new AssemblyName("Test.Gen, Version=1.0.0.1"), AssemblyBuilderAccess.RunAndSave); var dynModule = dynGeneratorHostAssembly.DefineDynamicModule( "Test.Gen.Mod", "generated.dll"); var dynType = dynModule.DefineType( "Test.MapperOne", TypeAttributes.Abstract | TypeAttributes.Sealed | TypeAttributes.Public); var dynMethod = dynType.DefineMethod( "callme", MethodAttributes.Static, typeof(TOut), new Type[] { typeof(TIn) }); var prm = dynMethod.DefineParameter(1, ParameterAttributes.None, "source"); GenerateMapMethodBody(dynMethod.GetILGenerator(), prm, mapping); var finalType = dynType.CreateType(); dynGeneratorHostAssembly.Save("generatedasm.dll"); var realMethodInfo = finalType.GetMethod(dynMethod.Name); var methodToken = dynMethod.GetToken().Token; var methodInfo = dynModule.ResolveMethod(methodToken); return (MapMethod)Delegate.CreateDelegate( typeof(MapMethod), (MethodInfo)methodInfo); } 

рдпрд╣ рдХреЛрдб рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ? рд╣рд╛рдВ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЬреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рд╡рд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рд╡рд░реНрддрдорд╛рди рдбреЛрдореЗрди рдореЗрдВ рдПрдХ рдбрд╛рдпрдирд╛рдорд┐рдХ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЖрдк рдПрдХ рдЕрд▓рдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ) рдФрд░ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрд╕реЗрдВрдмрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ: рдХреЗрд╡рд▓ рд░рди, рдХреЗрд╡рд▓ рд╕рд╣реЗрдЬреЗрдВ, рдпрд╛ рд╕рднреА рдХреЛ рдПрдХ рд╕рд╛рде (рдЕрд╕реЗрдореНрдмрд▓реА рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд) рдпрджрд┐ рдЖрдк рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдУрд╡рд░рд╣реЗрдб рд╣реЛрдЧрд╛ рдпрд╛ рдирд╣реАрдВред .Net 4 рдореЗрдВ, рдкреГрд╖реНрдард╛рдВрдХрд┐рдд рдбрд╛рдпрдирд╛рдорд┐рдХ рдЕрд╕реЗрдВрдмрд▓реА (рдЕрд╕реЗрдВрдмрд▓реАрдмреНрд░рд╛рдЙрдЯрд▓рдЕрдмреЗрд▓.рдСрдирдПрдВрдбрдХреЙрд▓реЗрдЬ) рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рджрд┐рдЦрд╛рдИ рджреА рд╣реИред рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдЕрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣рд╛рдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рджреЗрдЦреЗрдВред
рдЕрдЧрд▓рд╛, рд╣рдо рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ рдХрд┐ рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдЕрдХреНрд╕рд░ рдПрдХ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдорд▓реНрдЯреА-рдореЙрдбреНрдпреВрд▓ рдЕрд╕реЗрдВрдмрд▓рд┐рдпрд╛рдВ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдПрдХ рдореЙрдбреНрдпреВрд▓ рдПрдХ рднреМрддрд┐рдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдореЙрдбреНрдпреВрд▓ рдореЗрдВ, рд╣рдо рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рдпрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╕рд╛рдзрд╛рд░рдг DefineType рдХреЙрд▓ ("Test.MapperOne") рдЯреЗрд╕реНрдЯ рдирд╛рдо рдореЗрдВ рдПрдХ рдирд┐рдЬреА рдореИрдкрд░рдСрди рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдЧреАред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЖрдкрдХреЛ рдирд╛рдо рд╕реЗ рдЙрддреНрдкрдиреНрди рд╡рд░реНрдЧреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдмреЗрд╣рддрд░ рдирд╛рдо рдФрд░ рдирд╛рдо рд╕реНрдерд╛рди рджреЗрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡реЗ рдирд┐рд╢рд╛рди рдХреЗ рдвреЗрд░ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдпрджрд┐ рдЖрдк рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ рдПрдХ рдкрд░рд╛рд╡рд░реНрддрдХ рдХреЗ рд╕рд╛рде рдЙрддреНрдкрдиреНрди рд╕рдВрд░рдЪрдирд╛ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдЦрдж рд╣реЛрдЧреАред "рдмрдВрдж рдХрд░реЛ!", рдЪреМрдХрд╕ рдкрд╛рдардХ рдХрд╣реЗрдВрдЧреЗред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЬреЛ рд╡рд░реНрдЧ рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ рд╡рд╣ рдирд┐рдЬреА рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ, рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ? рдареАрдХ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рдЦреНрддреА рд╕реЗ рд╕рд╣реА рд╣реЛ, рддреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦреЗрдВ:
 var dynType = dynModule.DefineType("Test.MapperOne", TypeAttributes.Abstract | TypeAttributes.Sealed | TypeAttributes.Public); 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдкреНрд░рдХрд╛рд░ рдореЗрдВ, рд╣рдо рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╡рд┐рдзрд┐ рдХреЗ рдЗрдирдкреБрдЯ рддрд░реНрдХреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рд╣рдорд╛рд░реА рдкрджреНрдзрддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдЕрдкрдиреА рдЙрддреНрдкрдиреНрди рд╡рд┐рдзрд┐ рдХреЛ рдЕрд░реНрде рдХреЗ рд╕рд╛рде рднрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдмрд╛рдж рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо GenerateMapMethodBody (dynMethod.GetILGenerator (), prm, рдореИрдкрд┐рдВрдЧ) рдкрд░ рдХреЙрд▓ рдЫреЛрдбрд╝реЗрдВ рдФрд░ рдЖрдЧреЗ рджреЗрдЦреЗрдВред
рдкреНрд░рдХрд╛рд░ рдХреА рд╕рднреА рд╡рд┐рдзрд┐рдпрд╛рдБ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ dynType.CreateType () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж, рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЧрддрд┐рд╢реАрд▓ рдЬреЛрдбрд╝рддреЛрдбрд╝ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рддрдм рд╣рдорд╛рд░рд╛ рдкреНрд░рдХрд╛рд░ рдЕрдм рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред CreateType рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, CLR рдХреЛ рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЙрд╕рдореЗрдВ рдореМрдЬреВрдж рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдкрддрд╛ рд╣реИред рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬреЛ DefineDynamicAssembly рдХреЙрд▓ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдбреЛрдореЗрди рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рдФрд░ DefineDynamicModule рдХреЙрд▓ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рдореЙрдбреНрдпреВрд▓ред
рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ: рдЬрдм рд╣рдордиреЗ рдбреЗрдлрд┐рди рдЯрд╛рдЗрдк рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛, рддреЛ рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрдмрд░реНрд╕реНрдЯрд▓ рд▓реМрдЯрд╛ред рдпрджрд┐ рдЖрдк TypeBuilder рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ Type рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдкрдХрд╛ Type TypeBuilder рд╣реИ, рддреЛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрднреА рддрдХ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рд╣рдореЗрд╢рд╛ рдПрдХ NotSupportedException рд▓реМрдЯрд╛рдПрдВред рдХреБрдЫ рддрд░реАрдХреЗ CreateType рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╕рдВрдмрдВрдзрд┐рдд RuntimeType рдкрд░ рдХреЙрд▓ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕реА рддрд░рд╣ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдердбрдмреЙрдпрд▓ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рд╛рде рд╣реИ, рдЬреЛ рдореЗрдердбрдЗрдирдлреЛ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИред MethodBuilder рднреА рд╕рднреА рдЧреБрдгреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдФрд░ рд╕реНрдерд┐рддрд┐ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реИ рдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Delegate.CreateDelegate MethodInfo рдХреЛ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рд╡рд╣рд╛рдВ MethodBuilder рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдорд┐рд▓реЗрдЧрд╛ (CreateType рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА)ред рдЗрд╕рд▓рд┐рдП рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВред

рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рдзрд┐

рд▓реЗрдХрд┐рди рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдЕрд╕реЗрдВрдмрд▓реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдк рдмрд╕ рдПрдХ рдмрд╣реБрдд рдЫреЛрдЯреА рд╡рд┐рдзрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддрдм рдЖрдк рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд "рдЕрд░реНрдерд╡реНрдпрд╡рд╕реНрдерд╛" рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реЛрдЧрд╛ - рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рдзрд┐ред рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рд╕реЗ рдХреЛрдб рдХреЗ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХреЗ рдмрдЬрд╛рдп, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдЦреЗрдВ:
 protected MapMethod GenerateMapMethod2(IDictionary<string, string> mapping) { var dynMethod = new DynamicMethod("callme", typeof(TOut), new Type[] { typeof(TIn) }); var prm = dynMethod.DefineParameter(1, ParameterAttributes.None, "source"); GenerateMapMethodBody(dynMethod.GetILGenerator(), prm, mapping); return (MapMethod)dynMethod.CreateDelegate(typeof(MapMethod)); } 

рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдИ, рдЙрд╕реЗ рдЕрд░реНрде рд╕реЗ рднрд░ рджрд┐рдпрд╛ рдФрд░ рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд▓реМрдЯрд╛ рджрд┐рдпрд╛ред рд╣реЛ рдЧрдпрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдкреНрд░рд▓реЗрдЦрди рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдбрд╛рдпрдиреЗрдорд┐рдХ рдЕрд╕реЗрдВрдмрд▓реА, рдореЙрдбреНрдпреВрд▓ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрджрд┐ рдЖрдк рдкреНрд░рддрд┐рдмрд┐рдВрдм рдпрд╛ рдкреНрд░реЛрд╕реЗрд╕рдПрдХреНрд╕рдкреНрд▓реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдбрд╛рдпрдиреЗрдорд┐рдХ рдЕрд╕реЗрдВрдмрд▓реА рдлрд┐рд░ рднреА рдмрдирд╛рдИ рдЧрдИ рд╣реИ (рд╕рднреА рдбрд╛рдпрдирд╛рдорд┐рдХ рдбреЛрдореЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ)ред рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕рдореЗрдВ рдПрдХ рдкреНрд░рдХрдЯ рдореЙрдбреНрдпреВрд▓ рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ (рдкрд░рд╛рд╡рд░реНрддрди рджреНрд╡рд╛рд░рд╛) рд╣рдорд╛рд░реА рд╡рд┐рдзрд┐ рдореЗрдВ рдирд╣реАрдВ рдвреВрдВрдв рд╕рдХрд╛ред рдлрд┐рд░ рднреА, рд╡рд╣ рд╣реИ рдФрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рдзрд┐ рдФрд░ рдЕрдкрдиреА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рд╕рднреА рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рднреА рдЗрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╡рд┐рдзрд┐ рдереЛрдбрд╝реА рддреЗрдЬ рдФрд░ рдЕрдзрд┐рдХ рдХрд┐рдлрд╛рдпрддреА рд╣реЛрдЧреАред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЕрдирд╛рдо рд╣реЛрд╕реНрдЯрд┐рдВрдЧ (рдЕрдирд╛рдо рд░реВрдк рд╕реЗ рд╣реЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛ рдореЙрдбреНрдпреВрд▓ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рд╡рд┐рдзрд┐ "рдЫрдбрд╝реА" рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИрдВ рдЬреЛ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рд╡реИрд╢реНрд╡рд┐рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдВрддрд░рд┐рдХ рд▓реЛрдЧреЛрдВ рд╕рд╣рд┐рдд рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдореЙрдбреНрдпреВрд▓ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИред рд╡рд░реНрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдХрдХреНрд╖рд╛ рдХреЗ рд╕рднреА рдЖрдВрддрд░рд┐рдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрдЧреАред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк "рдЕрдирд╛рдо" рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рднреА рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рдзрд┐ рд╕реЗ рдЗрди рд╡рд░реНрдЧреЛрдВ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдХрд┐рдкрд░ рд╡рд┐рдЬрд┐рдмрд┐рд▓рд┐рдЯреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ (рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ JIT рд╕рддреНрдпрд╛рдкрди рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, CAS рд╕рддреНрдпрд╛рдкрди рд╕реЗ рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рд╡реИрд╕реЗ, "рдЕрдирд╛рдо" рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗрд╡рд▓ .net 3.0 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреАред

рд╡рд┐рдзрд┐ рд╢рд░реАрд░

рдФрд░ рдЕрдм рд╣рдо рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рдЖрддреЗ рд╣реИрдВ - рд╣рдо рдХреЛрдб рдХреИрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ? рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреЛрдб GenerateMapMethodBody рдкрджреНрдзрддрд┐ (dynMethod.GetILGenerator (), prm, рдореИрдкрд┐рдВрдЧ) рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ, рд╣рдо ILGenerator, рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдореИрдкрд┐рдВрдЧ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ - рдПрдХ рд╡рд░реНрдЧ рд╕реЗ рджреВрд╕рд░реЗ рд╡рд░реНрдЧ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдкрддреНрд░рд╛рдЪрд╛рд░ред ILGenerator рд╡рд░реНрдЧ рдЖрдкрдХреЛ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рд╡рд┐рдзрд┐ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ CIL рдХрдорд╛рдВрдб рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡рд╣ рдПрдорд┐рдЯ рд╡рд┐рдзрд┐ рд╕реЗ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред ILGenerator рдЖрдкрдХреЛ DefineLabel рдкрджреНрдзрддрд┐ (рд╕рд╢рд░реНрдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП рд▓реЗрдмрд▓ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, DefineLocal рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рдмрдирд╛рддрд╛ рд╣реИред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреЗ рд▓рд┐рдП, рдкреНрд░рдкрддреНрд░ BeginCatchBlock, BeginExceptFilterBlock, рдЖрджрд┐ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рд╕реЗрдЯ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред CIL рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрдорд╛рдВрдб рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ (рдореВрд▓реНрдпрд╛рдВрдХрди рд╕реНрдЯреИрдХ, рдЗрд╕рдХреЗ рдмрд╛рдж рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ рд╕реНрдЯреИрдХ рд╣реИ)ред рд╕реАрдПрд▓рдЖрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕реНрдЯреИрдХ рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдкрд░реЗ рди рдЬрд╛рдПрдВ, рдПрдХ рд╣реА рд░рд╛рд╕реНрддрд╛ рдпрд╛ рджреВрд╕рд░рд╛ред рдпрджрд┐ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдПрдХ StackOverflowException рдорд┐рд▓реЗрдЧреА, рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдЦрд╛рд▓реА рд╕реНрдЯреИрдХ рд╕реЗ рдорд╛рди рд▓реЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдПрдХ рдРрд╕рд╛ рдорд╛рди рдЬреЛ рд╡рд╣рд╛рдВ рдЖрдкрдХреА рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рдерд╛ (рдЕрд░реНрдерд╛рдд, рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ "рдЗрд╕рдХреЗ рд╕реНрдЯреИрдХ рдХреЗ рднрд╛рдЧ" рдХреЛ рджреЗрдЦрддреА рд╣реИ), рддреЛ рдЖрдкрдХреЛ рдПрдХ InvalidProgramException рдорд┐рд▓реЗрдЧреАред рдЖрдкрдХреА рдкрджреНрдзрддрд┐ рдореЗрдВ рджрд┐рдП рдЧрдП рддрд░реНрдХ рдвреЗрд░ рдкрд░ рдЭреВрда рдирд╣реАрдВ рдмреЛрд▓рддреЗ рд╣реИрдВ; рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ OpCodes.Ldarg рдЯреАрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд┐рдзрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╕реНрдЯреИрдХ рдорд╛рдиреЛ рдЦрд╛рд▓реА рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж рдЦрд╛рд▓реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ InvalidProgramException рдлрд┐рд░ рд╕реЗ рд╣реЛрдЧрд╛ред рдФрд░ рдпрд╣ CIL рдХреЛрдб рдЬрдирд░реЗрд╢рди рдХреЗ рдорд┐рдирд┐рдпрд╛рдЬрд╝ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ: рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдПрдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЪрд░рдг рдореЗрдВ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдпрд╛ рдЖрд░рдВрднреАрдХрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рддреНрд░реБрдЯрд┐рдпрд╛рдВред

IL рдХреЛрдб рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрдХрдиреАрдХ рдПрдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╣реИ, рдЬреЛ рдЖрдк рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ (рд╕рдВрдХрд▓рди рд╕реЗ рдкрд╣рд▓реЗ рд░рд┐рд▓реАрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ, рдЗрд╖реНрдЯрддрдо рдХреЛрдб рд╕реЗ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдирд╛) рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ CIL рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдРрд╕реЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛрдб рдХреЛ рджреЗрдЦрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╣рд╛рдБ рднреА рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рддрд┐рдмрд┐рдВрдм EmitLanguage рдкреНрд▓рдЧрдЗрди рд╣реИред рдпрд╣ рдкреНрд▓рдЧрдЗрди рдкрд░рд╛рд╡рд░реНрддрдХ рдореЗрдВ рджреЗрдЦреЗ рдЧрдП рд╡рд┐рдзрд┐ рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреЛрдб рдХреЛ рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╣ рдХреЛрдб рдЬреЛ рджреЗрдЦреЗ рдЧрдП рдХреЛрдб рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рд╣рд╛рде рдореЗрдВ рдХреЛрдИ рдкрд░рд╛рд╡рд░реНрддрдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк .net SDK рд╕реЗ IL Disassembler (ildasm.exe) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдИрдорд╛рдирджрд╛рд░ рд╕реАрдЖрдИрдПрд▓ рдХреЛ рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рдЖрдкрдХреА рдкрджреНрдзрддрд┐ рдХрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЕрдЧрд▓рд╛, рд╣рдо рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЙрд╕реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕ рд╡рд┐рдзрд┐ рдпрд╛ рдЗрд╕рдХреЗ рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдореБрд╣рд░рдмрдВрдж рд╡рд░реНрдЧ рдпрд╛ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдЖрднрд╛рд╕реА рд╡рд┐рдзрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред

рдорд╛рди рд▓реАрдЬрд┐рдП, рдХрд╣реАрдВ рд╕реЗ рд╣рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЧреБрдгреЛрдВ рдХреЗ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХрд╛ рдкрддрд╛ рд╣реИ, рддреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
  public static TestTarg GenerateTemplate(TestSrc src) { var result = new TestTarg(); result.SomeOtherID = (double)src.SomeID; return result; } 

рд╣рдо рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ IL Disassembler рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ:
 .method private hidebysig static class ConsoleApplication1.TestTarg GenerateTemplate(class ConsoleApplication1.TestSrc src) cil managed { // Code size 21 (0x15) -  ,   .maxstack 2 // -  CLR   //     .locals init ([0] class ConsoleApplication1.TestTarg result) //     (  +  ) //           IL_0000: newobj instance void ConsoleApplication1.TestTarg::.ctor() //        0 IL_0005: stloc.0 //        0 IL_0006: ldloc.0 //        0 IL_0007: ldarg.0 //  (  ),             .     . IL_0008: callvirt instance int32 ConsoleApplication1.TestSrc::get_SomeID() //  int  double IL_000d: conv.r8 //   ,            ( int) IL_000e: callvirt instance void ConsoleApplication1.TestTarg::set_SomeOtherID(float64) //    IL_0013: ldloc.0 //    IL_0014: ret } // end of method Program::GenerateTemplate 

рдЗрд╕ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдХреЛ рдХреЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ ILGenerator.Emit () рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
 //IL_0000: newobj instance void ConsoleApplication1.TestTarg::.ctor() //  var tTarg = typeof(TOut); var targetCtor = tTarg.GetConstructor(new Type[0]); gen.Emit(OpCodes.Newobj, targetCtor); ... //IL_0006: ldloc.0 gen.Emit(OpCodes.Ldloc, locResult); ... //IL_0008: callvirt instance int32 ConsoleApplication1.TestSrc::get_SomeID() var methodSrc = tSrc.GetProperty(methodMap.Key).GetGetMethod(); gen.Emit(OpCodes.Callvirt, methodSrc); ... //IL_0014: ret gen.Emit(OpCodes.Ret); 

рдпрджрд┐ рдЖрдк рд░рд┐рдлреНрд▓реЗрдХреНрд╢рди.рдЗрдорд┐рдЯ рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдФрд░ рднреА рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдпрд╣ рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рдЖрдкрдХреЛ ILGenerator.Emit () рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рд╣реИред
 public MethodBuilder BuildMethodGenerateTemplate(TypeBuilder type) { // Declaring method builder // Method attributes System.Reflection.MethodAttributes methodAttributes = System.Reflection.MethodAttributes.Private | System.Reflection.MethodAttributes.HideBySig | System.Reflection.MethodAttributes.Static; MethodBuilder method = type.DefineMethod("GenerateTemplate", methodAttributes); // Preparing Reflection instances MethodInfo method1 = typeof(TestSrc).GetMethod(/*  */); MethodInfo method2 = typeof(TestTarg).GetMethod(/**/); // Setting return type method.SetReturnType(typeof(TestTarg)); // Adding parameters method.SetParameters( typeof(TestSrc) ); // Parameter src ParameterBuilder src = method.DefineParameter(1, ParameterAttributes.None, "src"); ILGenerator gen = method.GetILGenerator(); // Preparing locals LocalBuilder result = gen.DeclareLocal(typeof(TestTarg)); // Writing body gen.Emit(OpCodes.Ldloca_S,0); gen.Emit(OpCodes.Initobj,TestTarg); gen.Emit(OpCodes.Ldloca_S,0); gen.Emit(OpCodes.Ldarg_0); gen.Emit(OpCodes.Callvirt,method1); gen.Emit(OpCodes.Conv_R8); gen.Emit(OpCodes.Call,method2); gen.Emit(OpCodes.Ldloc_0); gen.Emit(OpCodes.Ret); // finished return method; } 

рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрддрд╛ msdn рдореЗрдВ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, OpCodes рд╡рд░реНрдЧ рдореЗрдВ рд╕рднреА рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рд╣реИрдВред "рдорд╛рдереЗ" рдирд╣реАрдВ, рдХреБрдЫ рдЖрджреЗрд╢реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, stloc.0 рдЬреИрд╕реА рдЖрдЬреНрдЮрд╛рдПрдБ, рднреНрд░рдорд┐рдд рди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рди рд▓рд┐рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ:
 gen.DeclareLocal(yourType); gen.Emit(OpCodes.Ldloc_0); 

рдФрд░ рдЗрддрдирд╛:
 var locResult = gen.DeclareLocal(yourType); gen.Emit(OpCodes.Ldloc, localVar); 

рдЖрдк рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреБрдЫ рдирд┐рд░реНрдорд╛рдг рдЬреЛ рдХрд╣рддреЗ рд╣реИрдВ, C # рдореЗрдВ рд╕рдорд╛рди рд╣реИрдВ, CIL рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
 var c = new RefType(); // reference  var a = new RefType[0]; //  var s = new ValType(); // value  // reference  var targetCtor = typeof(RefType).GetConstructor(new Type[0]); gen.Emit(OpCodes.Newobj, targetCtor); //  gen.Emit(OpCodes.Newarr, typeof(RefType)); // value  LocalBuilder loc = gen.DeclareLocal(typeof(ValType)); gen.Emit(OpCodes.Ldloca, loc); gen.Emit(OpCodes.Initobj, typeof(ValType)); 

рдореИрдВ рд░реЗрдлрд░реА рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рднреА рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдХреНрдпреЛрдВрдХрд┐ рд░реЗрдл рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдПрдХ рдорд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд▓рд┐рдВрдХ рд╣реЛрддрд╛ рд╣реИ, рдлрд┐рд░ рд╕реАрдЖрдИрдПрд▓ рд╕реНрддрд░ рдкрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣ рдПрдХ рддрд░рд╣ рдХрд╛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрдмреЛрдзрди рд╣реИред рдпрджрд┐ рдпрд╣ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд░реЗрдлрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рддреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реЛрдЧрд╛, рдФрд░ рд╕рд░рд▓ ldarg рдХрдорд╛рдВрдб рд╕реНрдЯреИрдХ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд▓рд┐рдВрдХ рдХреЛ рд▓рд┐рдВрдХ рдХрд░реЗрдЧрд╛ (рджреЛ рдЪреАрдбрд╝ рдХреЗ рдкреЗрдбрд╝реЛрдВ рдореЗрдВ рдЦреЛ рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдореМрдХрд╛)ред рд╕реНрдЯреИрдХ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ ldind.ref рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдпрджрд┐ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдорд╛рди рдХрд╛ рд░реЗрдл рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ (рд▓реЗрдХрд┐рди рд╕рдВрд░рдЪрдирд╛ рдирд╣реАрдВ), рддреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдорд╛рди рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реЛрдЧрд╛ред рдФрд░ рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рдореВрд▓реНрдп рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ ldarg рдпрд╛ starg рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди ldind рдпрд╛ stindред
рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ (рдмрд┐рд▓реНрдХреБрд▓ рд╡рд┐рдкрд░реАрдд)ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рдЪрд░ рд╣реИ, рддреЛ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдкрддрд╛ рд╕реНрдЯреИрдХ рдкрд░ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП ldarga рдХрдорд╛рдВрдб рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдкрд╣реЗрд▓реА: regexp рдФрд░ CIL рдЬреЗрдирд░реЗрд╢рди рдореЗрдВ рдХреНрдпрд╛ рд╕рдорд╛рдирддрд╛ рд╣реИ? рдЙрддреНрддрд░: рдмреЗрд╣рдж рдореБрд╢реНрдХрд┐рд▓ рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧред рдЗрд╕рд▓рд┐рдП, рдЬрдирд░реЗрдЯрд┐рдВрдЧ рдХреЛрдб рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдореЗрдВ рдЖрд▓рд╕ рди рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдП рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдкреИрджрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдареАрдХ рд╣реИ, рдпрд╛, рдХрд╣рд┐рдП, рдЙрддреНрдкрд╛рджрди рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ, рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ 80% рдЕрдзрд┐рдХ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдорддреМрд░ рдкрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред

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

рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ:

рдпреБрдкреАрдбреА:
рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реНрдорд╛рд░реНрдЯ рд▓реЛрдЧреЛрдВ рдХрд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рд╕реГрдЬрди рдХреЗ рдХрдард┐рди рдХрд╛рд░реНрдп рдореЗрдВ рднреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

рдореИрдВрдиреЗ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рдореИрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ред

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

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


All Articles