DLL应用程序的在线更新

时间:2011-07-05 13:31:30

标签: c++ dll updates

我有一个插件应用程序,它是在(外部)C ++主机内运行的C ++ DLL。 我想允许插件的在线更新。 我怎么能这样做?

一种可能的方法是将DLL分离为包装DLL和内容DLL 在每次更新时移动到新的内容DLL。

有没有更好的方法来实现这一目标?

由于

3 个答案:

答案 0 :(得分:0)

如果您无法控制主机,则必须自行进行动态加载/卸载。正如您所注意到的,您将需要两个DLL。这可能是最简单的方法,但您需要确保在交换DLL时主机不会造成任何伤害。最简单的解决方案可能是加载两个DLL,然后在卸载旧代码之前在它们之间执行原子切换。

答案 1 :(得分:0)

一个问题是如何让主机应用程序重新启动/重新加载插件,以及如何让它用另一个插件替换你的DLL。

在Windows下(假设Windows,因为你说的是​​DLL),你有一个问题,因为在加载到内存时你无法将可执行映像(包括DLL)替换为另一个。在POSIX下,这没有问题(这甚至可以正常工作而没有任何副作用!),但Windows将锁定图像以进行独占访问。

因此,除了首先卸载DLL,然后替换它,然后重新加载它,别无选择。这可以按照您的描述完成。

另一种选择,如果主机应用程序允许,那就是编写第二个独立插件,告诉应用程序卸载要更新的插件,然后更新它,然后告诉托管应用程序重新加载它。

答案 2 :(得分:0)

是的,您无法直接更新正在使用的DLL。具有两个DLL的解决方案有效但可能很复杂。至少我不会在应用程序运行时卸载并加载新的DLL。下次加载插件时,请下载并加载新DLL。

此外,您可以将更新程序设置为自动启动文件夹中的EXE(并且没有第二个DLL)。如果有更新,它会下载文件并将其复制到正确的位置。如果由于ERROR_ACCESS_DENIED而失败,则用户已经启动了应用程序,并且您的更新将在用户下次登录时进行复制。 我认为这更容易,更充分(您必须决定)并且对用户透明 - 他可以从自动启动文件夹中删除更新或手动启动它。