.NET рдореЗрдВ рдЕрд╕реЗрдВрдмрд▓реА рд▓реЛрдбрд┐рдВрдЧ, рдСрдкрд░реЗрдЯрд┐рдВрдЧ рдФрд░ рдЕрдирд▓реЛрдбрд┐рдВрдЧ рдЕрд╕реЗрдВрдмрд▓рд┐рдВрдЧ

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


рдЗрд╕рд▓рд┐рдП рдХрд╛рд░реНрдп: рдЖрдкрдХреЛ рдПрдХ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ExtensionLoader, рдЬреЛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░, рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЕрдкрдиреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рд╕рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ IExtension рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
interface IExtension { String GetExtensionName(); } 

рдкрд╛рдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрд╡реЗрджрди рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рдпрд╛ рд╡рд░реНрдЧ (IExtension рдХреЗ рд╕рд╛рде) рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХрдорд╛рддреНрд░ GetExtensionName () рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред

рдпрд╣ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдРрд╕рд╛ рдерд╛ ...

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

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

рдЕрдЧрд▓рд╛, рд╣рдо IExtension рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдП рдЧрдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрдЧрд╛ред
  public class Extension1 : MarshalByRefObject, IExtension { public Extension1() { } public string GetExtensionName() { return "Extension 1 from " + AppDomain.CurrentDomain.FriendlyName; } } 


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

рдЖрдЧреЗ рдореИрдВ рдЖрдкрдХреЛ "рдЙрдмрд╛рдК рддрд░реАрдХреЗ" рджреВрдВрдЧрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рджреЗрдЦрдирд╛ рдирд╣реАрдВ рд╣реИред рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓реЛрдбрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдирдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧрд┐рддрд╛рд╡рд╛рджреА рдХрд╛рд░реНрдп рд╣реИред
  /// <summary> ///    . /// </summary> /// <param name="domain">,      .</param> private static IEnumerable<IExtension> EnumerateExtensions(AppDomain domain) { IEnumerable<string> fileNames = Directory.EnumerateFiles(domain.BaseDirectory, "*.dll"); if (fileNames != null) { foreach (string assemblyFileName in fileNames) { foreach (string typeName in GetTypes(assemblyFileName, typeof(IExtension), domain)) { System.Runtime.Remoting.ObjectHandle handle; try { handle = domain.CreateInstanceFrom(assemblyFileName, typeName); } catch (MissingMethodException) { continue; } object obj = handle.Unwrap(); IExtension extension = (IExtension)obj; yield return extension; } } } } /// <summary> ///    ,    . ///     . /// </summary> /// <param name="assemblyFileName">   </param> /// <param name="interfaceFilter"> </param> /// <param name="domain">   .</param> /// <returns>   .</returns> private static IEnumerable<string> GetTypes(string assemblyFileName, Type interfaceFilter, AppDomain domain) { Assembly asm = domain.Load(AssemblyName.GetAssemblyName(assemblyFileName)); Type[] types = asm.GetTypes(); foreach (Type type in types) { if (type.GetInterface(interfaceFilter.Name) != null) { yield return type.FullName; } } } 


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рд╕рд░рд▓ рддрд░реАрдХреЗ рднреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд▓реЗрдЦ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╡рд┐рдзрд┐рдпрд╛рдВ рдЕрдЬреАрдм рд▓рдЧ рд╕рдХрддреА рд╣реИрдВ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдХреЙрд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдпреЗ рдХреЗрд╡рд▓ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВред
  /// <summary> ///   . /// </summary> /// <param name="path">    .</param> /// <returns>  .</returns> static AppDomain CreateDomain(string path) { AppDomainSetup setup = new AppDomainSetup(); setup.ApplicationBase = path; return AppDomain.CreateDomain("Temporary domain", null, setup); } /// <summary> ///   . /// </summary> /// <param name="domain">  .</param> static void UnloadDomain(AppDomain domain) { AppDomain.Unload(domain); } 


рдЦреИрд░, рдФрд░ рдЕрдВрдд рдореЗрдВ, рдореБрдЦреНрдп рд╡рд┐рдзрд┐ ... рдЬреЛ рдпрд╣ рд╕рдм "рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ"
  static void Main(string[] args) { //   ,     . AppDomain domain = CreateDomain(Directory.GetCurrentDirectory()); try { //    . IEnumerable<IExtension> extensions = EnumerateExtensions(domain); foreach (IExtension extension in extensions) //   .     . Console.WriteLine(extension.GetExtensionName()); //      .     . UnloadDomain(domain); } finally { domain = null; GC.Collect(2); } Console.ReadKey(); } 

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


All Articles