如何让plugin.dll调用核心应用程序的功能?

时间:2019-07-19 09:54:12

标签: c# plugins reflection

好的。因此,我想构建一个程序,该程序充当“插件”模块的核心。 另一个开发人员可以创建plugin1.dll并将其添加到“ modules”文件夹中,以增强我的核心应用程序的功能。

因此,可以说我的核心具有以下功能:

  • 记录
  • 用户身份验证
  • 用户界面

例如,我们有如上所述的核心应用程序,有人想要添加一个插件,该插件可以让用户查看当前时间并将其记录到standard-log.txt中。

因此,他将创建一个具有以下功能的类库:

  • 获取当前时间(.dll中包含的功能)
  • 显示当前时间(.dll中包含的功能)
  • 记录当前时间(功能包含在核心中)

现在我的问题是,我可以使用反射轻松地从核心应用程序中调用插件的功能,但是反过来又如何呢?
我的plugin1.dll如何访问和调用核心程序的完全设置的日志记录功能?

我希望你能回答我的问题。我希望我的plugin1.dll能够作为核心类的示例记录方法来调用。

谢谢!

1 个答案:

答案 0 :(得分:0)

我建议将您的问题分为两个方面:

  1. 插件如何知道核心中可用的功能 应用程序(在编译时)?
  2. 他们如何才能在运行时实际调用这些功能?

第一个方面的答案是创建一个单独的interface-dll,它定义核心应用程序将提供的一个(或多个)接口。请注意,这仅应包含接口定义,而不包含实现。然后,插件开发人员可以导入该dll,并针对该接口进行编程(无需依赖您完整的核心实现)。

第二个方面的答案:您可以要求插件公开一个众所周知的初始化入口点。在该方法中,您可以为他们提供对核心实现的引用作为参数,以便他们可以存储该引用并根据需要在该接口上调用方法。

一个简单的示例可能类似于以下内容:

接口dll:

public interface ICoreApplication
{
    //These are the methods that you want to provide to your plugins:
    void LogMessage(string msg);
    //void SomeOtherMethod(...)
    //...
}

public interface IPlugin
{
    //These are the methods that you expect from your plugins:
    void Init(ICoreApplication coreReference);
}

(顺便说一句:IPlugin接口还可以包含其他方法,如果您确实知道插件所希望提供的功能。在那种情况下,您不必通过反射来调用插件,而是通过界面。)

核心应用程序:

public class Core : ICoreApplication
{
    public void InitPlugins()
    {
        IPlugin somePlugin = ...; //retrieve via reflection
        somePlugin.Init(this);
    }
}

请注意,这只是一个简单的示例,用于说明基本概念。提供强大的插件架构还有很多。您需要考虑类似

  • 安全性(可以信任您的插件吗?可以信任从中加载文件的文件系统吗?)
  • 错误处理(如果插件引发异常怎么办?如果它想通知您“预期的失败”怎么办?)
  • 线程化(如果在主线程上调用插件,它们可能会阻塞整个应用程序。如果在其他线程上调用它们,则需要考虑同步。如果插件创建了新线程并调用了内核,该怎么办?该线程上的应用程序?)
  • 等...
相关问题