从DLL调用主程序方法

本文关键字:方法 主程序 调用 DLL | 更新日期: 2023-09-27 18:05:55

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

我在主窗体上有两个方法,我通过插件接口作为动作传递,我在组装加载期间将方法分配给插件内的动作,然后调用这些动作并传递一个值,该值从主程序执行方法并执行其任务。

我在这里想知道的是,除了使用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");
    }
}

从DLL调用主程序方法

你可以定义一个"Host"接口,在那里有方法,并把它传递给Plugin。

或者,你可以使用一个共享的源文件,它只包含一个委托签名(所以没有引用和依赖),这基本上是你使用Func时所做的,只有你可以使它更精确和更好的命名。

我已经从接口中删除了一些自由裁量的动作,而是静态地创建了一个自定义事件处理程序,在一个类中(在插件接口DLL文件中),以接收程序和;插件。