【问题标题】:How can I let a plugin.dll call functions of core-application?如何让 plugin.dll 调用核心应用程序的功能?
【发布时间】:2019-07-19 09:54:12
【问题描述】:

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

假设我的核心具有以下功能:

  • 日志记录
  • 用户认证
  • 用户界面

例如,我们有上面提到的核心应用程序,有人想添加一个插件,让用户查看当前时间并将其记录到标准日志中。

所以他会创建一个具有以下功能的类库:

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

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

我希望你能得到我的问题。我希望我的 plugin1.dll 能够调用我的核心类的示例日志记录方法。

谢谢!

【问题讨论】:

  • 提供一个带有接口的共享程序集,现在双方都可以使用这些抽象。
  • @thehennyy 这也是我的第一个想法。将模块和核心应用程序共享、使用的所有功能移至由它们全部实现的程序集。我不太确定它会如何工作。能给我举个简单的例子吗?

标签: c# plugins reflection


【解决方案1】:

我建议把你的问题分成两个方面:

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

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

之类的事情
  • 安全性(你能信任你的插件吗?你能信任加载它们的文件系统吗?)
  • 错误处理(如果插件抛出异常会发生什么?如果它想通知您“预期失败”怎么办?)
  • 线程(如果您在主线程上调用插件,它们可能会阻塞您的整个应用程序。如果您在其他线程上调用它们,则需要考虑同步。如果插件创建一个新线程并调用您的核心怎么办该线程上的应用程序?)
  • 等等……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    相关资源
    最近更新 更多