在线更新DLL应用程序
Online Update of a DLL application
我有一个插件应用程序,它是一个运行在(外国)c++主机内的c++ DLL。我想允许在线更新插件。我该怎么做呢?
一种可能的方法是将DLL分离为包装器DLL和内容DLL在每次更新时移动到新的内容DLL。
有更好的方法来实现这一点吗?
谢谢
如果您无法控制主机,那么您必须自己进行动态加载/卸载。正如您正确注意到的那样,您将需要两个dll。这可能是最简单的方法,但是您需要确保主机在交换dll时不会造成任何损害。最简单的解决方案可能是加载两个dll,然后在卸载旧代码之前在它们之间执行原子切换。
一个问题是如何让主机应用程序重新启动/重新加载插件,以及如何让它用另一个DLL替换您的DLL。
在Windows下(假设是Windows,因为你说的是DLL),你有一个问题,你不能用另一个可执行映像(包括DLL)替换它加载到内存中。在POSIX下,这将没有问题(而且这甚至可以可靠地工作而没有任何副作用!),但是Windows将锁定映像以独占访问。
因此,您没有其他选择,只能先卸载DLL,然后替换它,然后再次加载它。这可以按你说的做。
如果主机应用程序允许,另一种选择是编写第二个独立于的插件,告诉应用程序卸载要更新的插件,然后更新它,然后告诉主机应用程序重新加载它。
是的,您不能直接更新正在使用的DLL。使用两个dll的解决方案可以工作,但可能比较复杂。至少我不会在应用程序运行时卸载和加载新的DLL。下次加载插件时,执行下载并加载新的DLL。
另外,你可以让你的更新程序是一个EXE(没有第二个DLL),这是在自动启动文件夹。如果有更新,它会下载文件并将其复制到正确的位置。如果由于ERROR_ACCESS_DENIED而失败,则用户已经启动了应用程序,并且您的更新将在用户下次登录时进行复制。我认为这对用户来说更容易、更充分(你必须做出决定)和更透明——他可以从自动启动文件夹中删除更新,或者手动启动。
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- C# DLL 从C++应用程序调用 SOAP Web 服务
- 将 c++ 生成器应用程序与外部 dll 结合使用
- WinDeployqt 不会为调试应用程序部署 Qwindowsd.dll
- Log4net,将日志消息从 c++ dll 发送到 c# 应用程序?
- 调试 ASP MVC 应用程序中使用的C++ DLL
- Qt应用程序找不到第三方DLL并崩溃
- 如何将从控制台应用程序C++回调设置为C++ COM DLL
- 我可以用C++/WinRT编写一个DLL,供windows桌面应用程序(而不是UWP)或Unity插件使用吗
- .NET核心应用程序无法加载C++DLL
- 在通用 Windows 应用程序C++上使用 win32 DLL 库
- 从 C# Windows 应用程序调用 C dll 会导致 svchost.exe 崩溃
- 使用 C++ dll 运行 c# 应用程序会生成无法加载异常
- 为什么我的 C# 应用程序无法加载我的 C++ dll?
- 应用程序仅在qt调试器中加载dll,而不是独立加载
- 如果在 DLL 和调用应用程序中使用 GPGPU API,会发生什么情况
- C++ XE 5 应用程序和C++生成器 5 dll 兼容性
- 如何将C++ dll 在 C# 窗口窗体应用程序下的工作线程中运行
- 使用Visual Studio 2015创建的C 应用程序分发MSVCR120.dll