【问题标题】:(Windows) How to make auto-update function for plugin?(Windows) 如何为插件设置自动更新功能?
【发布时间】:2015-09-12 22:30:29
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 通过显示一些代码来改进您的问题,并详细说明您的程序和系统。
  • 您应该将代码的相关部分放在问题中(每个源代码行之前至少有四个空格),而不是在外面给出链接。

标签: windows dll plugins auto-update


【解决方案1】:

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

这取决于操作系统(我猜可能是 Windows,因为您说的是 DLL;在 Linux 上,shared objects(在 ELF 中)具有不同的语义)。阅读莱文的书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,即调用堆栈。您会明白您的问题(也与正交persistenceapplication checkpointing 相关)比您想象的要深得多,也更难。而且升级类及其实例也非常困难。

【讨论】:

  • 很抱歉,我想在 Windows 上执行此操作。在 Windows 上,它在运行过程中加载时无法替换。我在这里知道一个 API:msdn.microsoft.com/en-us/library/windows/desktop/… 这个 API 有一个标志 MOVEFILE_DELAY_UNTIL_REBOOT,它将替换直到系统重新启动。但这不是一个好主意。我想在进程重新启动时替换它。 :(
  • 也许你想做一些在 Windows 上不可能的事情。您是否尝试为 DLL 加载 不同的 文件路径?您可能需要提出一个更好、更集中的问题,并在其中显示一些源代码。不要忘记正确标记您的问题(如果它是特定于 Windows 的,则标记为 Windows
  • 我认为这不是不可能的事情。我看到一些应用程序可以。它只能包含在 Plugins 文件夹中。所以我不能改变它的路径。
  • 正如我告诉你的,我不了解 Windows,也从未使用过它(但我从 1974 年开始编码)。所以我帮不了你。您应该问一个更具体的问题并显示一些代码(在另一个问题中)。如果它特定于 Windows,则使用 Windows 对其进行标记。但是你应该阅读关于Kitsune的论文,它的可读性很强,并且带来了非常有趣的问题。
  • 我编辑了我的问题。感谢您的回答,对于提出的问题不清楚,我深表歉意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
相关资源
最近更新 更多