如何使用插件在应用程序中使用版本号?

时间:2012-01-05 10:53:38

标签: c# .net dll coding-style

我想编写一个允许为其编写插件的程序 该程序将包含带有一些DLL库的SDK,这将有助于插件的开发。

但是,我很确定随着时间的推移SDK会发生变化,因此需要SDK和插件的某种版本号。 SDK由许多DLL组成。

此外,我不希望插件开发人员能够忘记执行该机制所需的操作。

我可以想到两种方式:

  • 使用常量编译时间 int VERSION = 1 。每个插件以某种方式(我不知道具体如何),取这个常量,并将其作为编译时常量添加到DLL中。加载插件时

  • 对所有SDK模块使用相同的AssemblyVersion。加载插件时,请检查插件的程序集版本是否低于当前的SDK程序集版本。在这种情况下,我需要以某种方式同步程序版本和SDK版本。

所以,我不确定如何做到这两点。

你有什么想法吗?

3 个答案:

答案 0 :(得分:3)

我根本不会介绍版本控制概念。 如果您认为Host需要什么:

  • 找到并加载插件的可能性
  • 通过向插件公开功能或从插件中恢复,可以与它们进行交互。

如何管理SDK中的开发更改?

首先:所有更改必须尽可能多地兼容。

如果不可能怎么办?

好吧,Host 搜索以查看已加载插件中的公开功能,如果找不到,则会得出3个可能的结论。

  1. 插件是针对较新版本的Host编写的,但旧版本使用

  2. 插件是为较早版本的Host编写的,但较新版本使用。

  3. 它不是一个valud插件。

  4. 当然,您可以在插件的Host上添加所需的MainClass版本属性,Host可以搜索它,这有助于轻松识别可能的版本冲突。为什么可能,因为版本可能不同,但架构可以非常可靠,无需插件供应商来更改其中的内容。

    希望这有帮助。

答案 1 :(得分:2)

根据@Andrey的要求,这是对我对OQ的评论的详细说明:

插件(如在插件程序集中)通常包含一个classm,它实现了一个接口,例如IMyPlugin

在大多数情况下,这个接口需要有一个类似InitPlugin()的方法,允许插件设置其结构等,即初始化。

这个InitPlugin()本身通常希望在主程序中调用类似RegisterPlugin()的东西来向应用程序注册它的功能。这通常也通过IMyPluginHost等接口实现。

现在,只要您保持这些接口如此通用,以及它们自己不需要更改,您就可以轻松地使用此序列添加版本握手:

public interface IMyPluginHost
{
  public int RegisterPlugin(int FunctionalityGroup, object WorkerBee, int MinSDKVersion, int MaxSDKVersion);
  ... //Whatever you need to allow the plugin to call into the app
}

public interface IMyPlugin
{
  public int InitPlugin(IMyPluginHost myhost); //Return value is hust an error code
  ... //Whatever you need to allow the app to call into the plugin
}

现在,当应用程序决定加载插件时,它将创建实现IMyPluginHost的内部插件宿主类,然后物理加载插件,获取IMyPlugin到其类并调用

((IMyPlugin)pluginClass).InitPlugin(this)

该插件现在可以循环其功能组(哪些组取决于您的应用程序 - 如果它是例如图像处理应用程序,可能有功能组,如Filter,FileTypeImport,FileTypeExport,Brush,...每个都有他们的接口)并为每个实例化一个工人对象,然后调用

host.RegisterPlugin(FunctionalityGroup, WorkerBee, MinSDKVersion, MaxSDKVersion);

主机是IMyPluginHost,它与InitPlugin()相符。

因此,如果插件仅针对SDK V5构建,MinSDKVersion和MaxSDKVersion都将为5.但是如果智能插件可以处理SDK版本2-5 MinSDKVersion将为2而MaxSDKVersion将为5.这允许一个插件可以使用您应用的不同版本(以及SDK)

该应用程序本身也有一系列支持的SDK版本,比如3-6。因此,在这种情况下,对RegisterPlugin()的调用将返回5,因为这是两个合作伙伴支持的最高SDK版本。同样,这为您的应用程序提供了一种支持旧插件的方法,因此升级您的应用程序不会破坏所有第三方插件。

InitPlugin()的否定返回值将是错误。

完成此操作后,插件会引用主机,并根据SDK版本了解它可以从中获得什么,反之亦然。

答案 2 :(得分:1)

创建一个所有插件必须实现的抽象类,并将版本检查逻辑放入其中,即返回插件与初始化插件后调用的插件兼容的主,次和内部编号的函数。

根据您要检查版本的严格程度,您可以在应用程序中进行响应。 (我还建议你使用SemVer作为版本,你会看到为什么你的API成熟了)

这也允许您检查在您的应用程序上运行的版本太旧或太新。