我正在尝试使用一个简单的函数重新创建现有的 C Win32 DLL。 我已经设法使用 VS C++ 2008 Express 来完成此操作,并且我的新 DLL 可在我的 Vista 开发计算机和客户端的 XP 计算机上运行。 但是,它在其他网站上不起作用。 我检查了依赖关系,我的 DLL 需要 MSVCR90D.dll 和 KERNEL32.dll,而原始 DLL 仅需要 KERNEL32.dll。
什么是 MSVCR90D.dll,如何创建一个没有此依赖项的简单 Win32 DLL?
名称中的“D”表示调试。这是 Visual Studio 调试构建的明确指标。使用发布版本,一切都会好起来的。
如果目标系统还没有C运行时,通常应该使用官方安装程序将其安装在那里。您可能想了解的一些运行时版本如下:
您还可以开发一个完整的安装包,其中包括应用程序所需的可再发行 DLL(但永远不会是调试 DLL),并使用已知的技术正确地将并行 (SxS) 程序集安装到系统程序集缓存中作为合并模块。如果您完整安装了 Visual Studio(不是免费的 VS Express 版本),则此方法会更容易,但生成的安装包仍然可能无法很好地处理旧版(例如 Win 2K 或 9x)平台上的运行时安装。 MSDN 文章
重新分发 Visual C++ 文件描述了规则是什么,以及如何尽可能轻松地遵守它们。它提供了一个了解更多与部署相关的许多问题的起点。 如果您要替换其功能的原始 DLL 没有对 MSVCR90.DLL 的引用,则它必须已静态链接到运行时。您可能应该检查将调用您的 DLL 的预期应用程序的假设。在单个进程中混合 C 运行时库并不总是那么容易。如果托管应用程序已经在使用 MSVCR90.DLL,那么您确实也应该这样做。然而,这是一个比当前具体问题的答案更大的问题,因此我鼓励您研究它并根据需要提出新问题。
避免安装后期运行时 DLL 的另一种方法是链接到 MSVCRT.DLL,它作为系统组件随现代版本的 Windows 一起分发。这是 Visual C 6.0 附带的运行时,针对关键问题进行了轻微更新,并保持最新以匹配操作系统。它根本不适用于 64 位构建,并且很难欺骗 Visual Studio 使用它来代替较新的运行时。
但是,可以制作依赖于 MSVCR90.DLL(该 DLL 的非调试版本)的调试 DLL。为此(VS 2008 SP1,其他 VS 的说明类似):
转到“项目属性”(在“解决方案资源管理器”窗格中右键单击该项目,从菜单中选择“属性”)。