рдФрд░ рдЙрд╕рдиреЗ рд╕рд╛рдЗрдХрд┐рд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ ...
рдореИрдВ рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕реЗ рдЕрд▓рдЧрд╛рд╡ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реВрдВред рдпрд╣ рд╕рдм рдПрдХ рдирдпрд╛ AppDomain рдмрдирд╛рдХрд░ рдФрд░ InternetZone рдкрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рдореИрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ рдЬрдм рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рдбреЛрдореЗрди рдореЗрдВ рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рдерд╛ред рд╕рдорд╕реНрдпрд╛ рдПрдХ рд╕рдВрдЪрд╛рд░ рддреНрд░реБрдЯрд┐ рдереАред рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдореИрдВ AppDomain.Load () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЬреИрд╕рд╛ рдХрд┐ рдмрд╛рдж рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛, рдпрд╣ рддрд░реАрдХрд╛ рдореБрдЭреЗ рд╢реЛрднрд╛ рдирд╣реАрдВ рджреЗрддрд╛ред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдПрдХ рдмрдбрд╝реА рдмреИрд╕рд╛рдЦреА рдирд╣реАрдВ рдмрдирд╛рдиреА рдереА, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред
рдЖрдЗрдП рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдФрд░ рдПрдХ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рдореИрдВрдиреЗ рдЗрд╕реЗ рдкреНрд▓рдЧрдЗрдирд╣реЙрд╕реНрдЯ рдирд╛рдо рджрд┐рдпрд╛ рд╣реИ) рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдЕрдиреНрдп рд╡рд░реНрдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЬреЛрдбрд╝реЗрдВ (рдЗрд╕реЗ рдкреНрд▓рдЧрдЗрдирдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╣рддреЗ рд╣реИрдВ)ред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХреНрд▓рд╛рд╕ рдЬреЛрдбрд╝реЗрдВ:
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 .
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 .
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 .
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 .
рдФрд░ рдПрдХ рдФрд░ рд╡рд░реНрдЧ, рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдерд╛:
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
- рдкрдмреНрд▓рд┐рдХ рдХреНрд▓рд╛рд╕ рдЕрд╕реЗрдВрдмрд▓реА рд╣реЗрд▓реНрдкрд░: рдорд╛рд░реНрд╢рд▓рдмрд╛рдЗрдлрдСрдмреНрдЬреЗрдХреНрдЯ
- {
- рдирд┐рдЬреА AppDomain _currentDomain;
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЕрд╕реЗрдВрдмрд▓реА рд╣реЗрд▓реНрдкрд░ ()
- {
- _currentDomain = AppDomain.CurrentDomain;
- _currentDomain.AssemblyResolve + = new ResolveEventHandler (_currentDomain_AssemblyResolve);
- }
- рдЕрд╕реЗрдореНрдмрд▓реА _currentDomain_AssemblyResolve ( рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЗрд╖рдХ, рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рдирдПрд╡рд░рдЧреЗрдЬрд╝ рдИ)
- {
- string [] nameSplit = e.Name.Split ( ',' );
- string path = Path.Combine (SearchFolder, nameSplit [0] + ".dll" );
- рдЕрд╕реЗрдВрдмрд▓реА рд▓реЛрдбрдЕрд╡реЗрд╢рди;
- рдХреЛрд╢рд┐рд╢
- {
- loadAssembly = рдЕрд╕реЗрдВрдмрд▓реА .LoadFile (рдкрде);
- }
- рдкрдХрдбрд╝ (рдЕрдкрд╡рд╛рдж рдкреНрд░рдХрд╛рд░)
- {
- рдЕрдкрд╡рд╛рдж exp = exc;
- рдлреЗрдВрдХ рджреЗрдирд╛ ;
- }
- рдЕрдЧрд░ (рд▓реЛрдбрдЕрд╕реНрдкреЗрд▓! = рдЕрд╢рдХреНрдд )
- {
- рд▓реМрдЯрд╛ рд╣реБрдЖ
- }
- рдЕрдиреНрдпрдерд╛
- {
- рд╡рд╛рдкрд╕реА ;
- }
- }
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ SearchFolder { рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ ; рд╕реЗрдЯ ; }
- }
рдмреЗрд╕ рдлреНрд░реЗрдо рддреИрдпрд╛рд░ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдВ рдЬреЛ рдХреБрдЫ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЙрд╕рдХрд╛ рдмрдбрд╝рд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдирд╣реАрдВ:
1. рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдореБрдЦреНрдп рдЖрд╡реЗрджрди рд╕реЗ рдЕрд▓рдЧрд╛рд╡
2. рдХрд┐рд╕реА рднреА рд╕рдордп, рдкреНрд▓рдЧрдЗрди рдХреЛ рд▓реЛрдб рдФрд░ рдЕрдирд▓реЛрдб рдХрд░рдирд╛ред рдпрджрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧ-рдЗрди рдХреНрд░реИрд╢ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдЕрдирд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореБрдЦреНрдп рдореЗрдВ рдХреНрдпрд╛ рд╣реИ:
рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкреНрд▓рдЧрдЗрдирдлреНрд░реЗрдорд╡рд░реНрдХ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдХреЗрд╡рд▓-рдкреНрд░рддрд┐рдмрд┐рдВрдм рдореЛрдб рдореЗрдВ рд▓реЛрдб рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╕рднреА рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ:
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
- рдЕрд╕реЗрдВрдмрд▓реА рдлреНрд░реЗрдорд╡рд░реНрдХрдлреНрд░реАрд▓реЗрдХреНрдЯ = рдЕрд╕реЗрдВрдмрд▓реА редReflectionOnlyLoadFrom (Path.Combine (Environment.CurrentDirectory, "PluginFramework.dll" ));
- BasePluginType = FrameworkReflect.GetType ( "MyPluginSample.Framework.Plugin" ) рдЯрд╛рдЗрдк рдХрд░реЗрдВ;
рдлрд┐рд░ рд╕рднреА рдЙрдкрд▓рдмреНрдз рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдореЗрдВ рдЦреЛрдЬреЗрдВ
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
- string pathPlugins = Path.Combine (Environment.CurrentDirectory, "Plugins" );
- DirectoryInfo DirectoryPlugins = new DirectoryInfo (pathPlugins);
- foreach (рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ var dirPlugins.GetDirectories ())
- {
- FileInfo dllFile = dir.GetFiles (dir.Name + ".dll" ) .First ();
рдФрд░ рдлрд┐рд░, рдореИрдВ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдм-рдХреЗрд╡рд▓ рдореЛрдб рдореЗрдВ рд▓реЛрдб рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рдФрд░ рдЙрд╕ рд╡рд░реНрдЧ рдХреА рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкреНрд▓рдЧрд┐рди рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рддрд╛рдХрд┐ рд╣рдо рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдкреНрд▓рдЧ-рдЗрди рдХреЗ рд╕рд╛рде рд▓реЛрдб рдХрд░ рд╕рдХреЗрдВ рдФрд░ рдЗрд╕реЗ рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░ рд╕рдХреЗрдВ, рд╣рдореЗрдВ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд▓рд┐рдП PluginFramework рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓реЛрдб рдХрд░рдирд╛ рдерд╛ред
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
- рдЕрд╕реЗрдВрдмрд▓реА рд░рд┐рдлреНрд▓реЗрдХреНрд╢рдирдПрд╕реНрдо = рдЕрд╕реЗрдВрдмрд▓реА редReflectionOnlyLoadFrom (dllFile.FullName);
- рдЯрд╛рдЗрдк рдЯрд╛рдЗрдкрдкреНрд▓рдЧрд┐рди = рд░рд┐рдлреНрд▓реЗрдХреНрд╢рдирдПрд╕реНрдо.рдЧреЗрдЯрдЯрд╛рдЗрдкреНрд╕ ()ред рдкрд╣рд▓рд╛ (рдЯреА => рдЯреА.рдЖрдИрдПрд╕ рд╢реБрдХреНрд▓рд╛рд╕рдСрдл (рдмреЗрд╕рдкреНрд▓реБрдЧрд┐рди рдЯрд╛рдЗрдк));
рдЕрдм рдЖрдк рдПрдХ рдирдпрд╛ рдбреЛрдореЗрди рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рдЖрдкрдХреЛ рдЬреЛ рдХреБрдЫ рднреА рдЪрд╛рд╣рд┐рдП рдЙрд╕реЗ рд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкреНрд▓рдЧрдЗрди рдХреЛ рдЪрд▓рд╛рдПрдВ
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
- AppDomain pluginDomain = AppDomain.CreateDomain (dir.Name + "plugin" );
- рдЕрд╕реЗрдВрдмрд▓реА рд╣реЗрд▓реНрдкрд░ = (рдЕрд╕реЗрдВрдмрд▓реА рд╣реЗрд▓реНрдкрд░) рдкреНрд▓рдЧрдЗрдирдбреЛрдореЗрди.рдХреНрд░рд┐рдПрдЯрдЗрдиреНрд╕реНрдЯреЗрдВрд╕рдПрдВрдбрдпреВрд╡рд░реНрд╡рдк ( "рдкреНрд▓рдЧрд┐рдирдлреНрд░реЗрдорд╡рд░реНрдХ" , "рдорд╛рдпрдкреНрд▓реБрдЧрд┐рдирд╕рдореНрдкреНрд▓.рдлреНрд░реЗрдорд╡рд░реНрдХ.рд╡реЗрдЬрд╝рд╣реЗрд▓реНрдкрд░" );
- helper.SearchFolder = dir.FullName;
- рдкреНрд▓рдЧрдЗрди рдкреНрд▓рдЧрдЗрди = (рдкреНрд▓рдЧрдЗрди) рдкреНрд▓рдЧрдЗрдиDomain.CreateInstanceAndUnwrap (рд░рд┐рдлреНрд▓реЗрдХреНрд╢рдиAsm.FullName, typePlugin.FullName);
- plugin.Initialize ();
рд╡рд╣ рд╕рдм рд╣реИ!
рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦреЗрдВ
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд░реНрдЧ MyPlugin1: Plugin
- {
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдУрд╡рд░рд░рд╛рдЗрдб рд╢реВрдиреНрдп рд╢реВрдиреНрдп ()
- {
- рдХрдВрд╕реЛрд▓ .WriteLine ( "рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди 1. рдбреЛрдореЗрди рдЖрдИрдбреА: {0}" , AppDomain.CurrentDomain.Id);
- }
- }
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ

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