简体   繁体   中英

C# Plugins and event handlers

I'm trying to write some kind of plugin framework... The problem is: I want to use methods from plugins as event handlers for controls in the host application and prevent loading plugin assembly into the main appdomain. The following code causes plugin.dll to be loaded into the main appdomain =( Is there any other way to do that?

Host application:

public partial class Form1 : Form
{
    private AssemblyLoader _aLoader = null;

    public Form1()
    {
        InitializeComponent();

        AppDomain _domain = AppDomain.CreateDomain("Remote Load");
        _aLoader = (AssemblyLoader)_domain.CreateInstanceAndUnwrap(
                                 "Loader", "Loader.AssemblyLoader");

        _aLoader.Load();

        EventHandler eh = (EventHandler)Delegate.CreateDelegate(typeof(EventHandler), _aLoader.Instance, _aLoader.Method);

        button1.Click += eh;
    }
}

AssemblyLoader:

[Serializable]
public class AssemblyLoader : MarshalByRefObject
{
    object _instance = null;
    MethodInfo _method = null;

    public void Load()
    {
        Assembly _assembly = Assembly.LoadFile(Environment.CurrentDirectory + @"\Plugin.dll");
        Type _type = _assembly.GetType("Plugin.Test");
        _instance = Activator.CreateInstance(_type);
        _method = _instance.GetType().GetMethod("TestEventHandler");
    }

    public MethodInfo Method
    {
        get { return _method; }
    }

    public object Instance
    {
        get { return _instance; }
    }
}

Plugin:

[Serializable]
public class Test
{
    public void TestEventHandler(object sender, System.EventArgs e)
    {
        MessageBox.Show("Pingback from plugin");
    }      
}

Don't waste your valuable time writing your own framework. Use an existing:

http://clraddins.codeplex.com/

http://blogs.msdn.com/b/clraddins/

Also check this answer that talk about the comparison with MAF & MEF, the two popular frameworks.

Those framework as well written, they are .NET standard and well supported.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM