我可以通过检查DLL本身来判断使用哪个版本的Visual Studio来构建DLL

我需要重建几年前建立的DLL。 我有原始的C源代码,但不是Visual Studio项目或解决方案。 我想尝试使用最初使用的相同Visual Studio版本重建它。 我可以说这是一个普通的旧Windows DLL,而不是.NET。 我也知道源代码在C中。通过检查DLL二进制文件,还有什么我可以告诉原始构建环境和工具吗?

谢谢!

当然,这完全有可能。 关键是所有PE格式的映像(可执行二进制文件的Windows格式,包括DLL和EXE)都包含包含二进制本身属性和其他信息的标头。 Microsoft的工具链始终在该标头中设置字段,以指示用于构建它的工具的版本。 因此,您可以转储该标头并检查这些字段以找出您想知道的内容。

虽然有第三方应用程序可以为您提取和打印这些信息,但如果您安装了任何版本的Visual Studio或Windows SDK,则最简单的方法是dumpbin。 打开Visual Studio命令提示符,键入dumpbin /headers ,然后按Enter键 。 你会得到一个大的标题数据列表; 不要让它吓倒你,你只对几个领域感兴趣。

向上滚动到顶部。 对于DLL,您将看到文件类型是DLL(显然)。 “FILE HEADER VALUES”部分中的第一个属性有时也很有趣:它告诉您DLL是用于32位还是64位计算机。 然后查看“链接器版本”字段下一节“可选链接值”。 正如我所提到的,这是由所有Microsoft链接器填充的,其中包含用于创建二进制文件的链接器版本。 格式为major.minor,因此14.00是Visual Studio 2015,10.00是Visual Studio 2010等。维基百科上有这些版本号的表 (这里你想要的列标有“版本号”,因为你想要的版本链接器 ,而不是编译器的版本,cl.exe)。 其他可能有趣的领域是“操作系统版本”和/或“子系统版本” – 这些将告诉您构建二进制文件的目标版本的Windows。 例如,10.00表示Windows 10,5.01表示Windows XP,依此类推。 再次,请参阅Wikipedia以获取Windows版本号表 。

另一个相关的信息可能是您的二进制链接的C运行时库(CRT)的哪个版本(假设它实际上链接到CRT)。 您也可以使用dumpbin来确定这一点,但这次查看导入。 (或者您可以使用Process Explorer之类的东西来获得漂亮的列表。)运行dumpbin /imports ,然后滚动列表查找以“MSVCR”开头的内容。 名称的其余部分表示版本号。 MSVCR80表示VC ++ 8或VS 2005.MSVCR90表示VC 9或VS 2008.MSVCR100表示​​VC 10或VS 2010.依此类推。

即使已从二进制文件中删除符号,所有这些都有效。