рдЙрджрд╛рд╣рд░рдг рдкреНрд▓рдЧрдЗрди рдкреНрд░рдгрд╛рд▓реА

рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рдо рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧ-рдЗрди (рдРрдб-рдЗрдиреНрд╕) рдХреА рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдХреИрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХреА рдЬрд╛рдПред рдереЛрдбрд╝рд╛ рд╕рд╛ AddIn рдХреА рдЦреБрджрд╛рдИ рдХрд░реЗрдВ рдЬреЛ .NET 3.5 рдХреЗ рдмрд╛рдж рд╕реЗ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рдереЗ, рдореИрдВрдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рд╡реЗ рдореБрдЭреЗ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддреЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрддрд┐рд░рд┐рдХреНрддред рджреВрд╕рд░реЗ, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдХрд┐рд╕реА рднреА рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдШреБрд╕рдкреИрда рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рдХрдо рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд┐рд▓рд┐рдЯреАред

рдФрд░ рдЙрд╕рдиреЗ рд╕рд╛рдЗрдХрд┐рд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ ...



рдореИрдВ рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕реЗ рдЕрд▓рдЧрд╛рд╡ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реВрдВред рдпрд╣ рд╕рдм рдПрдХ рдирдпрд╛ AppDomain рдмрдирд╛рдХрд░ рдФрд░ InternetZone рдкрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рдореИрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ рдЬрдм рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рдбреЛрдореЗрди рдореЗрдВ рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рдерд╛ред рд╕рдорд╕реНрдпрд╛ рдПрдХ рд╕рдВрдЪрд╛рд░ рддреНрд░реБрдЯрд┐ рдереАред рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдореИрдВ AppDomain.Load () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЬреИрд╕рд╛ рдХрд┐ рдмрд╛рдж рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛, рдпрд╣ рддрд░реАрдХрд╛ рдореБрдЭреЗ рд╢реЛрднрд╛ рдирд╣реАрдВ рджреЗрддрд╛ред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдПрдХ рдмрдбрд╝реА рдмреИрд╕рд╛рдЦреА рдирд╣реАрдВ рдмрдирд╛рдиреА рдереА, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред



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

public abstract class Plugin: MarshalByRefObject { public virtual void Initialize() { } } * This source code was highlighted with Source Code Highlighter .



  1. public abstract class Plugin: MarshalByRefObject { public virtual void Initialize() { } } * This source code was highlighted with Source Code Highlighter .



  2. public abstract class Plugin: MarshalByRefObject { public virtual void Initialize() { } } * This source code was highlighted with Source Code Highlighter .



  3. public abstract class Plugin: MarshalByRefObject { public virtual void Initialize() { } } * This source code was highlighted with Source Code Highlighter .



  4. public abstract class Plugin: MarshalByRefObject { public virtual void Initialize() { } } * This source code was highlighted with Source Code Highlighter .



  5. public abstract class Plugin: MarshalByRefObject { public virtual void Initialize() { } } * This source code was highlighted with Source Code Highlighter .



  6. public abstract class Plugin: MarshalByRefObject { public virtual void Initialize() { } } * This source code was highlighted with Source Code Highlighter .



public abstract class Plugin: MarshalByRefObject { public virtual void Initialize() { } } * This source code was highlighted with Source Code Highlighter .





рдФрд░ рдПрдХ рдФрд░ рд╡рд░реНрдЧ, рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдерд╛:





  1. рдкрдмреНрд▓рд┐рдХ рдХреНрд▓рд╛рд╕ рдЕрд╕реЗрдВрдмрд▓реА рд╣реЗрд▓реНрдкрд░: рдорд╛рд░реНрд╢рд▓рдмрд╛рдЗрдлрдСрдмреНрдЬреЗрдХреНрдЯ
  2. {
  3. рдирд┐рдЬреА AppDomain _currentDomain;
  4. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЕрд╕реЗрдВрдмрд▓реА рд╣реЗрд▓реНрдкрд░ ()
  5. {
  6. _currentDomain = AppDomain.CurrentDomain;
  7. _currentDomain.AssemblyResolve + = new ResolveEventHandler (_currentDomain_AssemblyResolve);
  8. }
  9. рдЕрд╕реЗрдореНрдмрд▓реА _currentDomain_AssemblyResolve ( рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЗрд╖рдХ, рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рдирдПрд╡рд░рдЧреЗрдЬрд╝ рдИ)
  10. {
  11. string [] nameSplit = e.Name.Split ( ',' );
  12. string path = Path.Combine (SearchFolder, nameSplit [0] + ".dll" );
  13. рдЕрд╕реЗрдВрдмрд▓реА рд▓реЛрдбрдЕрд╡реЗрд╢рди;
  14. рдХреЛрд╢рд┐рд╢
  15. {
  16. loadAssembly = рдЕрд╕реЗрдВрдмрд▓реА .LoadFile (рдкрде);
  17. }
  18. рдкрдХрдбрд╝ (рдЕрдкрд╡рд╛рдж рдкреНрд░рдХрд╛рд░)
  19. {
  20. рдЕрдкрд╡рд╛рдж exp = exc;
  21. рдлреЗрдВрдХ рджреЗрдирд╛ ;
  22. }
  23. рдЕрдЧрд░ (рд▓реЛрдбрдЕрд╕реНрдкреЗрд▓! = рдЕрд╢рдХреНрдд )
  24. {
  25. рд▓реМрдЯрд╛ рд╣реБрдЖ
  26. }
  27. рдЕрдиреНрдпрдерд╛
  28. {
  29. рд╡рд╛рдкрд╕реА ;
  30. }
  31. }
  32. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ SearchFolder { рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ ; рд╕реЗрдЯ ; }
  33. }
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рдмреЗрд╕ рдлреНрд░реЗрдо рддреИрдпрд╛рд░ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдВ рдЬреЛ рдХреБрдЫ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЙрд╕рдХрд╛ рдмрдбрд╝рд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдирд╣реАрдВ:

1. рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдореБрдЦреНрдп рдЖрд╡реЗрджрди рд╕реЗ рдЕрд▓рдЧрд╛рд╡

2. рдХрд┐рд╕реА рднреА рд╕рдордп, рдкреНрд▓рдЧрдЗрди рдХреЛ рд▓реЛрдб рдФрд░ рдЕрдирд▓реЛрдб рдХрд░рдирд╛ред рдпрджрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧ-рдЗрди рдХреНрд░реИрд╢ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдЕрдирд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ



рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореБрдЦреНрдп рдореЗрдВ рдХреНрдпрд╛ рд╣реИ:

рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкреНрд▓рдЧрдЗрдирдлреНрд░реЗрдорд╡рд░реНрдХ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдХреЗрд╡рд▓-рдкреНрд░рддрд┐рдмрд┐рдВрдм рдореЛрдб рдореЗрдВ рд▓реЛрдб рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╕рднреА рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ:





  1. рдЕрд╕реЗрдВрдмрд▓реА рдлреНрд░реЗрдорд╡рд░реНрдХрдлреНрд░реАрд▓реЗрдХреНрдЯ = рдЕрд╕реЗрдВрдмрд▓реА редReflectionOnlyLoadFrom (Path.Combine (Environment.CurrentDirectory, "PluginFramework.dll" ));
  2. BasePluginType = FrameworkReflect.GetType ( "MyPluginSample.Framework.Plugin" ) рдЯрд╛рдЗрдк рдХрд░реЗрдВ;
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рдлрд┐рд░ рд╕рднреА рдЙрдкрд▓рдмреНрдз рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдореЗрдВ рдЦреЛрдЬреЗрдВ





  1. string pathPlugins = Path.Combine (Environment.CurrentDirectory, "Plugins" );
  2. DirectoryInfo DirectoryPlugins = new DirectoryInfo (pathPlugins);
  3. foreach (рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ var dirPlugins.GetDirectories ())
  4. {
  5. FileInfo dllFile = dir.GetFiles (dir.Name + ".dll" ) .First ();
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рдФрд░ рдлрд┐рд░, рдореИрдВ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдм-рдХреЗрд╡рд▓ рдореЛрдб рдореЗрдВ рд▓реЛрдб рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рдФрд░ рдЙрд╕ рд╡рд░реНрдЧ рдХреА рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкреНрд▓рдЧрд┐рди рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рддрд╛рдХрд┐ рд╣рдо рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдкреНрд▓рдЧ-рдЗрди рдХреЗ рд╕рд╛рде рд▓реЛрдб рдХрд░ рд╕рдХреЗрдВ рдФрд░ рдЗрд╕реЗ рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░ рд╕рдХреЗрдВ, рд╣рдореЗрдВ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд▓рд┐рдП PluginFramework рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓реЛрдб рдХрд░рдирд╛ рдерд╛ред





  1. рдЕрд╕реЗрдВрдмрд▓реА рд░рд┐рдлреНрд▓реЗрдХреНрд╢рдирдПрд╕реНрдо = рдЕрд╕реЗрдВрдмрд▓реА редReflectionOnlyLoadFrom (dllFile.FullName);
  2. рдЯрд╛рдЗрдк рдЯрд╛рдЗрдкрдкреНрд▓рдЧрд┐рди = рд░рд┐рдлреНрд▓реЗрдХреНрд╢рдирдПрд╕реНрдо.рдЧреЗрдЯрдЯрд╛рдЗрдкреНрд╕ ()ред рдкрд╣рд▓рд╛ (рдЯреА => рдЯреА.рдЖрдИрдПрд╕ рд╢реБрдХреНрд▓рд╛рд╕рдСрдл (рдмреЗрд╕рдкреНрд▓реБрдЧрд┐рди рдЯрд╛рдЗрдк));
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


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





  1. AppDomain pluginDomain = AppDomain.CreateDomain (dir.Name + "plugin" );
  2. рдЕрд╕реЗрдВрдмрд▓реА рд╣реЗрд▓реНрдкрд░ = (рдЕрд╕реЗрдВрдмрд▓реА рд╣реЗрд▓реНрдкрд░) рдкреНрд▓рдЧрдЗрдирдбреЛрдореЗрди.рдХреНрд░рд┐рдПрдЯрдЗрдиреНрд╕реНрдЯреЗрдВрд╕рдПрдВрдбрдпреВрд╡рд░реНрд╡рдк ( "рдкреНрд▓рдЧрд┐рдирдлреНрд░реЗрдорд╡рд░реНрдХ" , "рдорд╛рдпрдкреНрд▓реБрдЧрд┐рдирд╕рдореНрдкреНрд▓.рдлреНрд░реЗрдорд╡рд░реНрдХ.рд╡реЗрдЬрд╝рд╣реЗрд▓реНрдкрд░" );
  3. helper.SearchFolder = dir.FullName;
  4. рдкреНрд▓рдЧрдЗрди рдкреНрд▓рдЧрдЗрди = (рдкреНрд▓рдЧрдЗрди) рдкреНрд▓рдЧрдЗрдиDomain.CreateInstanceAndUnwrap (рд░рд┐рдлреНрд▓реЗрдХреНрд╢рдиAsm.FullName, typePlugin.FullName);
  5. plugin.Initialize ();
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рд╡рд╣ рд╕рдм рд╣реИ!

рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦреЗрдВ





  1. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд░реНрдЧ MyPlugin1: Plugin
  2. {
  3. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдУрд╡рд░рд░рд╛рдЗрдб рд╢реВрдиреНрдп рд╢реВрдиреНрдп ()
  4. {
  5. рдХрдВрд╕реЛрд▓ .WriteLine ( "рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди 1. рдбреЛрдореЗрди рдЖрдИрдбреА: {0}" , AppDomain.CurrentDomain.Id);
  6. }
  7. }
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ





рд╕реНрд░реЛрдд PluginSystem.zip рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ



PS рдореИрдВ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд▓рд┐рдП рдЕрд╕реЗрдВрдмрд▓рд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рд╣рдо рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдПрдХ рдирдП рдбреЛрдореЗрди рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ рдЪрд╛рдЗрд▓реНрдб рдбреЛрдореЗрди рд╕реЗ рдирд╣реАрдВ рджреЗрдЦ рдкрд╛рдПрдВрдЧреЗ рдФрд░ рд╣рдореЗрдВ рдЬрд┐рд╕ рдХрдХреНрд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд╣ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛ред CLR рдЗрд╕ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдПрдХ рдмрд╛рд▓ рдбреЛрдореЗрди рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛



All Articles