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 .
* This source code was highlighted with Source Code Highlighter .
- public class AssemblyHelper: MarshalByRefObject
- {
- private AppDomain _currentDomain;
- public AssemblyHelper ()
- {
- _currentDomain = AppDomain.CurrentDomain;
- _currentDomain.AssemblyResolve + = new ResolveEventHandler (_currentDomain_AssemblyResolve);
- }
- Assembly _currentDomain_AssemblyResolve ( object sender, ResolveEventArgs e)
- {
- string [] nameSplit = e.Name.Split ( ',' );
- string path = Path.Combine (SearchFolder, nameSplit [0] + ".dll" );
- Assembly loadedAssembly;
- try
- {
- loadedAssembly = Assembly .LoadFile (path);
- }
- catch (Exception exc)
- {
- Exception exp = exc;
- throw ;
- }
- if (loadedAssembly! = null )
- {
- return loadedAssembly;
- }
- else
- {
- return null ;
- }
- }
- public string SearchFolder { get ; set ; }
- }
* This source code was highlighted with Source Code Highlighter .
- Assembly frameworkReflect = Assembly .ReflectionOnlyLoadFrom (Path.Combine (Environment.CurrentDirectory, "PluginFramework.dll" ));
- Type basePluginType = frameworkReflect.GetType ( "MyPluginSample.Framework.Plugin" );
* This source code was highlighted with Source Code Highlighter .
- string pathPlugins = Path.Combine (Environment.CurrentDirectory, "Plugins" );
- DirectoryInfo directoryPlugins = new DirectoryInfo (pathPlugins);
- foreach ( var dir in directoryPlugins.GetDirectories ())
- {
- FileInfo dllFile = dir.GetFiles (dir.Name + ".dll" ) .First ();
* This source code was highlighted with Source Code Highlighter .
- Assembly reflectionAsm = Assembly .ReflectionOnlyLoadFrom (dllFile.FullName);
- Type typePlugin = reflectionAsm.GetTypes (). First (t => t.IsSubclassOf (basePluginType));
* This source code was highlighted with Source Code Highlighter .
- AppDomain pluginDomain = AppDomain.CreateDomain (dir.Name + "plugin" );
- AssemblyHelper helper = (AssemblyHelper) pluginDomain.CreateInstanceAndUnwrap ( "PluginFramework" , "MyPluginSample.Framework.AssemblyHelper" );
- helper.SearchFolder = dir.FullName;
- Plugin plugin = (Plugin) pluginDomain.CreateInstanceAndUnwrap (reflectionAsm.FullName, typePlugin.FullName);
- plugin.Initialize ();
* This source code was highlighted with Source Code Highlighter .
- public class MyPlugin1: Plugin
- {
- public override void Initialize ()
- {
- Console .WriteLine ( "Executing in Plugin 1. Domain Id: {0}" , AppDomain.CurrentDomain.Id);
- }
- }
Source: https://habr.com/ru/post/101547/