【发布时间】:2011-03-07 22:14:37
【问题描述】:
是否可以在其“客户端”可执行文件运行时重新编译 MFC DLL,并让可执行文件检测并获取新的更改?如果可能,那是愚蠢的吗?能够在不重新启动 exe 的情况下重新编译 DLL 将在我的编码工作流程中节省一些时间。我使用的是 Visual Studio 2008,代码是用原生 C++/MFC 编写的。我的代码更改完全包含在 DLL 中,而不是 EXE。
谢谢!
【问题讨论】:
是否可以在其“客户端”可执行文件运行时重新编译 MFC DLL,并让可执行文件检测并获取新的更改?如果可能,那是愚蠢的吗?能够在不重新启动 exe 的情况下重新编译 DLL 将在我的编码工作流程中节省一些时间。我使用的是 Visual Studio 2008,代码是用原生 C++/MFC 编写的。我的代码更改完全包含在 DLL 中,而不是 EXE。
谢谢!
【问题讨论】:
不幸的是,除非可执行文件支持热交换 DLL,否则您无法执行此操作。 Windows 中的标准 DLL 加载机制将在进程开始时加载它,或者在第一次使用 DLL 导出的函数时加载它,并且不会观察文件的更改以重新加载它。此外,根据 DLL 的加载方式,文件可能会被锁定以进行更改。
您必须在重新编译之前停止您的客户端可执行文件。
【讨论】:
是的,这是可能的。您需要确保可执行文件显式加载您的 DLL(通过 LoadLibrary)。如果您的可执行文件隐式加载您的 DLL,您将遇到 Franci 描述的问题。
在可执行文件运行时更新库:
如果您的 DLL 实现了任何 COM 对象,请告诉我,我会给您一些额外的提示。
【讨论】:
LoadLibrary 调用之后为您需要的所有功能调用 GetProcAddress。而且由于它是一个 MFC DLL,因此您通常无法控制它。