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

泽萨雷克斯

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

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

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

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

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

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

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

我希望你能得到我的问题。我希望我的 plugin1.dll 能够作为我的核心类的示例 Logging-methods 调用。

谢谢!

普尼德尔

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

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

第一个方面的答案是创建一个单独的接口 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);
    }
}

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java应用程序通过JNI调用C ++ DLL;如何最好地分配内存?

如何从 VBA 应用程序调用 C DLL 并返回一个数组?

如何从内存中释放在VB6应用程序中调用的.Net DLL?

如何在C ++ / CLI DLL中从C#应用程序调用函数?

WindowsPE-如何运行电子应用程序,缺少dll

如何为dll设置主机应用程序

如何以DLL形式运行Page应用程序

如何使用从Delphi DLL加载的窗体的应用程序图标

如何确保其他应用程序使用我的 dll

如何防止应用程序DLL被反编译?

如何在DLL中捕获应用程序崩溃

Qt应用程序从Fortran调用Dll

如何调用合并的dll

如何调用快速应用程序的云功能?

如何从应用程序外部调用特定功能

如何从调用程序访问DLL的变量?

Dotnet Core-如何在已编译的应用程序中链接程序包(dll)

Web或控制台应用程序,如何获取当前DLL的应用程序上下文

Delphi应用程序无法调用简单的C ++ DLL函数

调试在线程内调用的delphi应用程序/ DLL

从Java应用程序调用C#dll

从 C# 应用程序调用 C++ DLL

我的 DLL 中的虚拟 MouseButtonEventHandler 被调用应用程序覆盖

Delphi:如何使用Windows API“ SendMessage”从DLL向应用程序发送变体数组?

如何从Linux上运行的Java应用程序加载本机库(.dll)?

如何在C#中从Windows窗体应用程序项目设置.dll文件的路径?

如何将没有托管代码的DLL打包到WPF应用程序中?

如何使用其他Linux平台中的所有dll文件部署Qt应用程序?

如何使我的应用程序加载正确的d3d9 * dll