建立在MS Visual Studio 2005上的C++ Exe是否可以动态加载建立在Visual Studio 2015上的DLL

问题描述:

目前我有一个第三方Visual Studio应用程序是基于Visual Studio 2005构建的,此应用程序使用我们的DLL中的一个插件框架。 最近这个DLL(客户端)建立在Visual Studio 2015上,这会导致第三方应用程序崩溃吗?建立在MS Visual Studio 2005上的C++ Exe是否可以动态加载建立在Visual Studio 2015上的DLL

有人能解释的Visual C运行时间在这种情况下

+7

***这会导致第三方应用程序崩溃吗?***它可以因为标准库在Visual Studio版本之间不兼容(2015年之前)。你将有超过1个CRT。如果内存分配/释放对dll是孤立的,那么对后一个问题应该没问题。如果他们不是UB,因为你不能在1堆中分配内存并将其释放到不同的堆中。 – drescherjm

++是如何工作的它实际上不是一个运行时。真正在DLL加载时,如果接口匹配,如果DLL内置在VS2015或VS2005中,则没有区别。

只有当库具有类C或类COM接口时,它们才会匹配。

此外,作为已经在评论中提到的,CRT库不兼容,但可以有一个解决方案:

任何DLL可以针对不同的CRT版本的链接,这就是与/ MT/MD/MTD规定所以选项https://msdn.microsoft.com/en-us/library/2kzt1wy3(v=vs.140).aspx如果您的库与CRT(即/ MT或/ MTd)具有静态链接,则它不会与外部环境发生冲突。然而,为了成功,你的图书馆没有权利释放任何从环境中获得的内存,也不允许该环境释放从你的库中获得的内存。它通常意味着遵循以下规则:分配内存的库必须释放它。作为解决方法,您可以使用HeapAlloc函数。

此外值得一提的是,如果您在任何STL容器的接口中使用,则没有任何成功的机会。 (std :: vector,map,set等),因为自2005年以来它们发生了巨大的变化。

如果你有一个关于CRT不兼容的问题,你可以尝试使用def files来精确指定要导出的函数和变量。你最好有C接口(你可以使用extern“C”构造来确保符号修改不会增加更多麻烦)