从DLL

时间:2015-08-02 22:11:22

标签: c# methods delegates

我有一个主程序,它动态加载DLL文件并激活一个包含所有核心操作的类文件,假设该类继承了插件接口。

我在主窗体上有两个方法,我通过插件接口作为Action传递,我在程序集加载期间将方法分配给插件中的Action,然后调用这些Actions并传递一个执行来自主程序的方法并执行其任务。

我想知道的是除了使用Action / Func委托之外还有其他任何替代方法,而不需要引用主程序(两者必须保持独立,仅由IPlugin接口相关,这是另一个在主程序和插件项目)并且不使用插件DLL文件本身内的任何方法调用。

或者我是否已经使用了最适合的方法?

- 编辑 -

//Interface
interface IPlugin
{
    Action<string> myAction;
}

//Main Program
public class MainForm
{
    void LoadPlugins(Action<string> myMethod) 
    {
        List<Assembly> Assemblies = new List<Assembly>();
        foreach (string file in Directory.GetFiles(Directory.GetCurrentDirectory(), "*.dll")) { Assemblies.Add(Assembly.LoadFile(file)); }
        foreach (Assembly a in Assemblies)
        {
            AppDomain.CurrentDomain.Load(a.GetName());
            foreach (Type x in a.GetTypes())
            {
                if (x.IsInterface || x.IsAbstract || x.GetInterface(typeof(IPlugin).FullName) == null) { continue; }
                IPlugin plugin = (IPlugin)Activator.CreateInstance(x);
                plugin.myAction = myMethod;
            }
        }
    }

    void OnLoad()
    {
        LoadPlugins(UpdateGUI);
    }

    void UpdateGUI(string Message)
    {
        txtBlockReport.Text += Message;
    }
}

//Plugin compiled as DLL, implementing & referencing IPlugin Interface.
public class MyPlugin : IPlugin
{
    public Action<string> myAction { get; set; }

    void OnLoad()
    {
        myAction("Plugin Loaded");
    }
}

2 个答案:

答案 0 :(得分:0)

你可以定义一个“主机”界面,在那里有方法,并将其传递给插件。

或者,您可以使用仅包含委托签名的共享源文件(因此没有引用也没有依赖关系),这基本上就是您在使用Func时所做的事情,只有您可以使其更精确并且更好地命名。

答案 1 :(得分:0)

我已从界面中删除了一些自行决定的操作,而是在一个类(在插件接口DLL文件中)静态创建了一个自定义事件处理程序,以接收程序和放大器的更新。插件。