1

您可能知道,Visual Studio 2005 的更新是上周在大多数机器上自动更新的。此更新包括新版本的 Visual c 运行时库。因此,更新后构建的任何二进制文件也需要在客户端系统上安装新的可再发行组件。

请参阅http://support.microsoft.com/kb/971090/

这是新的可再发行组件的安装程序:

http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=766a6af7-ec73-40ff-b072-9112bab119c2

这对于向客户分发新的二进制文件来说很好,我将使用安装程序发送新的可再分发文件,并且一切正常。

但是,如果他们发现错误,我真的很担心我修复现有客户站点的能力。在这种情况下,通常我只会发送已修复的 dll 或 exe。

但是,如果我现在这样做,我将不得不向这些客户发送新的可再发行组件,现在我将在同一个可执行文件中使用两个不同版本的 c 运行时库。

  • 这是一个问题吗?
  • 这会导致我的应用程序崩溃吗?
  • 如果我在一个 dll 中分配内存然后在另一个 dll 中释放它会发生什么?通常,如果使用相同的发布运行时库,这将起作用。大约 3 年前,我浏览了我们的代码来清理它,但我不能确定我已经找到并修复了所有出现的问题。
  • 不同dll中的分配/解除分配仍然是一个问题吗?现在,在智能指针等时代,必须强制执行这一点。
  • 我可以通过更改清单来控制我依赖的运行时库版本吗?

任何指示或建议将不胜感激。

更新:我刚刚注意到这个问题 VC++: KB971090 和选择 Visual C Runtime DLL dependencies 这非常相似,但我的问题更关心在一个可执行文件中使用两个不同版本的运行时。

4

3 回答 3

2

是的,您不必等待太多就可以看到使用两个运行时库的问题。

如果您使用运行时分配内存并尝试使用另一个运行时释放它,您的应用程序将崩溃。这是并且将继续是一个问题。

只有保留内存的运行时才能跟踪它。其他运行时不可能知道您保留了多少内存。

您可能想阅读这篇文章,这是一篇关于与 msvcrt.dll 链接的非常好的文章。

于 2009-08-06T16:23:17.360 回答
2

应用程序清单文件/资源​​中指定的版本号仅指定运行应用程序所需的最低版本。加载程序的默认行为是首先检查 WINDOWS\WinSxS 文件夹中是否存在应用程序清单中标识的依赖项的相同版本或替代版本,并使用该版本,无论是否包含该依赖项的私有程序集已随应用程序提供。(参见http://msdn.microsoft.com/en-us/library/aa375674(VS.85).aspx)。

因此,您的旧二进制文件很可能也将使用最新版本的 Microsoft 运行时库。尝试在完全修补的机器上运行应用程序的发布版本(在更新 Visual Studio 之前构建),并使用进程资源管理器查看它加载的 DLL。唯一的问题是您必须在补丁中包含新的运行时可再发行文件。

如果还是担心,可以试试这里介绍的方法:http: //tedwvc.wordpress.com/2009/08/10/avoiding-problems-with-vc2005-sp1-security-update-kb971090/

于 2009-09-02T04:59:24.160 回答
1

我听说(仅通过谣言)如果清单提供了两个版本的 CRT,它们仅在次要修订号上有所不同,那么应用程序最终只会在运行时使用较新的版本。即,您不会遇到多个 CRT 的问题。

这只是谣言,我很想听到一个具体的答案。

另请参阅:清单中的 Visual Studio 2005 安全更新和 CRT DLL 版本

于 2009-08-12T16:07:00.177 回答