C#插件和事件处理程序

时间:2010-09-15 16:44:00

标签: c#

我正在尝试编写某种插件框架......问题是: 我想使用插件中的方法作为主机应用程序中控件的事件处理程序,并防止将插件程序集加载到主appdomain中。以下代码导致plugin.dll被加载到主appdomain =(有没有其他方法可以做到这一点?

主持人申请:

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; }
    }
}

插件:

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

1 个答案:

答案 0 :(得分:2)

不要浪费宝贵的时间编写自己的框架。使用现有的:

http://clraddins.codeplex.com/

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

同时检查this answer与MAF& amp; MEF,两个流行的框架。

这些框架编写得很好,它们是.NET标准并得到很好的支持。