如何在没有MSVCR90D.dll的情况下创建Win32 DLL?

我试图用一个简单的函数重新创建一个现有的C Win32 DLL。 我已经设法使用VS C ++ 2008 Express,我的新DLL在我的Vista开发机器和客户端的XP机器上运行。 但是,它不适用于其他网站。 我检查了依赖项,我的DLL需要MSVCR90D.dll和KERNEL32.dll,其中原始DLL只需要KERNEL32.dll。

什么是MSVCR90D.dll,如何在没有此依赖项的情况下创建简单的Win32 DLL?

链接C运行时库的静态版本。 该设置位于项目属性中的“代码生成”下。 然后你根本不需要担心MSVCR * DLL。

MSVCR90D.dll末尾的D显示您在调试模式下编译了.exe。 您应该只在发布模式下分发您的应用程序。

您可以通过安装Microsoft Visual C ++ 2008 Redistributable Package x86或x64来确保他们拥有所需的一切。 否则你可以通过在计算机上找到它们来简单地复制它们所需的文件(首先在%systemroot%\ system32上查看)

请参阅此MSDN链接 。

名称中的“D”表示调试。 这是Visual Studio的Debug构建的一个明确指标。 使用Release版本,一切都会好的。

如果目标系统还没有C运行时,通常应该使用官方安装程序将其放在那里。 您可能想要了解的运行时的某些版本是:

  • VS2005 x86
  • VS2005 SP1 x86
  • VS2008 x86 x64
  • VS2008 SP1 x86

您还可以开发一个完整的安装包,其中包含应用程序所需的可再发行DLL(但绝不是调试DLL),并使用称为合并模块的技术正确处理并排(SxS)程序集到系统程序集高速缓存中的安装。 如果您完全安装Visual Studio(而不是免费的VS Express版本),这种方法会更容易,但生成的安装包仍然可能无法在较旧的(例如Win 2K或9x)平台上安装运行时。

MSDN文章重新分发Visual C ++文件描述了规则是什么,以及如何尽可能容易地遵守它们。 它提供了一个起点,可以了解有关部署的许多问题。

如果要替换其function的原始DLL没有对MSVCR90.DLL的引用,则它必须已静态链接到运行时。 您可能应该检查将调用您的DLL的预期应用程序的假设。 在单个进程中混合C运行时库并不总是那么容易。 如果托管应用程序已经在使用MSVCR90.DLL,那么你真的应该这样做。 然而,这是一个更大的问题,而不是回答手头的具体问题,所以我鼓励你研究它并根据需要提出新的问题。

避免安装后期运行时DLL的另一种方法是链接到MSVCRT.DLL,它与现代版本的Windows一起作为系统组件分发。 这是随Visual C 6.0一起提供的运行时,针对关键问题进行了轻微更新,并保持最新以匹配操作系统。 它根本不适用于64位构建,并且很难欺骗Visual Studio使用它来代替较新的运行时。

检查客户端的计算机是否在其系统上安装了2008运行时。 如果没有,您可以将其安装在他/她的系统上,也可以使用您的应用程序静态编译运行时。

您可能想要做的是构建DLL的发行版,测试它,然后分发它而不是现在分发的Debug版本。

但是,可以生成一个依赖于MSVCR90.DLL(该DLL的非调试版本)的调试DLL。 为此(VS 2008 SP1,其他VS的说明类似):

  1. 转到“项目属性”(在“解决方案资源管理器”窗格中右键单击项目,从菜单中选择“属性”)。
  2. 进入配置属性\ C / C ++ \代码生成。
  3. 在运行时库下,您可能选择了“multithreading调试DLL”。 将其更改为“multithreadingDLL”。

您将不得不重新编译所有内容,但您现在应该链接到非调试VS DLL。