(Windows)如何为插件制作自动更新功能?

时间:2015-09-12 22:30:29

标签: windows dll plugins auto-update

我有一个问题。我正在为应用程序(.exe)编写一个插件(.dll)。我想为我的插件编写自动更新功能,但我遇到了一个问题,它无法应用。因为我的插件已在应用程序运行时加载,所以在运行时它无法替换。它只适用于申请退出。那么,我该怎么做呢?

这是我的代码:http://codepad.org/4a22ccMa

谢谢!

1 个答案:

答案 0 :(得分:0)

(这回答了原始问题,已被编辑为完全不同的东西)

这取决于操作系统(我猜可能是Windows,因为你说的是​​DLL;在Linux上你有shared objects(在ELF中)有不同的语义)。阅读Levine的书Linkers and Loaders

您可以阅读有关Dynamic Software Updates的更多信息。这是一个完整的研究课题,有很多关于它的科学文献。阅读例如关于Kitsune: Efficient, General-purpose Dynamic Software Updating for C的论文(至少要了解你问题中的几个问题)。

在Linux上,你可以rename(2).sodlopen(3)新版本(可能dlclose旧版本,但是你应该稍后再做,{ call stack上的活动调用框指向旧插件),我的manydl.c示例显示您实际上可以dlopen共享对象(实践中超过一百万)。

在Windows上(我不知道)您可能需要在不同的文件路径中dynamically load插件的新版。也许,在插件更新后重新启动程序应该会让事情变得更容易。

(如果你负担得起,切换到Linux可能会非常有帮助,因为我觉得它更容易)

请注意,在某些语言(以及它们的一些实现)中,替换某些代码比在Windows上使用C或C ++更容易。我想在CLRmanaged code,例如在C#中)或在JVM中(例如在Java,Scala,Clojure中),它应该更容易。在Common Lisp(至少与SBCL)中,这很容易(特别是因为Common Lisp是一种homoiconic语言)。

照顾continuation,即调用堆栈。您了解您的问题(也与正交persistence& application checkpointing相关)比您想象的更深刻,更困难。升级类及其实例也非常困难。