Dependency Walker:无法解析并排配置信息包含错误

时间:2016-01-12 10:10:28

标签: c++ dll mfc

现在在使用旧DLL的Visual Studio 2015社区中重建了一个旧的MFC应用程序,我正在尝试(并撕掉我的头发)以确定在没有的机器上正确运行应用程序所需的运行时DLL的确切内容VS已安装。

目标操作系统是Windows 7.这是一个32位应用程序。

该应用程序使用DL​​L MAuEASE_s.dll,它使用mfc80.dllmsvcr80.dll DLL。我没有MAuEASE_s.dll的源代码,所以我无法重建/替换它。

在我的开发机器上,应用程序运行正常,并将以下文件集放入同一文件夹中:

  • 主要可执行文件
  • MAuEASE_s.dll
  • mfc80.dll
  • MSVCR80.DLL
  • 运行软件所需的ini文件

要测试它在客户端计算机中的行为方式,我在虚拟机上的Windows 7的全新副本上使用相同的文件集。该问题似乎仅限于MAuEASE_s.dll的mfc / msvcr依赖项。

在我的机器上,即使我将DLL放在可执行文件的目录中,也可以从以下文件夹中找到它们(从Dependency Walker中找到):

  • C:\ WINDOWS \ WINSXS \ x86_microsoft.vc80.mfc_1fc8b3b9a1e18e3b_8.0.50727.6195_none_cbf5e994470a1a8f \ MFC80.DLL
  • C:\ WINDOWS \ WINSXS \ x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.6229_none_d089f796442de10e \ MSVCR80.DLL

我在可执行文件目录中准确复制了这两个DLL,然后将目录复制到运行Windows 7的虚拟机中。在那里,Dependency Walker显示MAuEASE_s.dll的错误:

MAuEASE_s.dll的并排配置信息包含错误。

截图:

enter image description here

有趣的是,从MAuEASE_s.dll的清单中我发现它需要8.0.50727.4053版本的两个DLL。但是在开发机器c:\windows\winsxs中找到的DLL具有版本8.0.50727.61958.0.50727.6229,但这些DLL仍可在开发机器上运行。

我在Windows目录中搜索了DLL的版本8.0.50727.4053并找到它们并将其替换为应用程序的可执行目录。该应用程序仍然适用于开发机器。

这些版本都不适用于虚拟机。

发生了什么,如何在未安装Visual Studio的PC中找到运行应用程序的确切DLL?

3 个答案:

答案 0 :(得分:3)

我的回答并不针对如何修复WinSxS错误的问题。它只显示了如何强制系统加载应用程序本地MFC DLL。

MFC80。 DLL属于VS-2005。他们并排为MFC引入了加载DLL。因此DLL中的Manifest告诉加载器在WinSxS目录中找到一个公共版本。

即使您没有MAuEASE_s.dll的来源,您也可以在更改嵌入式清单时更改行为。它只是一个XML块。

您可以在VS中打开DLL,然后可以在那里修改资源。 (导出/导入它)。或使用其他工具修改可执行文件的资源(资源黑客等)

很久以前我写了一篇文章,将MFC DLL用作应用程序目录中的私有程序集。您只需从清单中删除一个令牌即可。请参阅here

另外,您可以按照文章中的描述创建一个新的清单,并用mt.exe替换现有的清单。

答案 1 :(得分:1)

在Visual Studio 2010之前使用Visual Studio构建的二进制文件通过清单(嵌入式或外部式)引用相关DLL。通过清单引用的依赖项仅在本机并排程序集缓存(WinSxS文件夹)中进行搜索。不搜索应用程序的目录。要验证二进制文件是否包含嵌入式清单,您可以使用清单工具Mt.exe

mt.exe -inputresource:<filename of binary> -out:manifest.txt

要部署通过清单引用DLL的应用程序,或者引用那些引用DLL的应用程序,您应该使用相应的vcredist_<architecture>.exe下载来部署这些二进制文件。

如果您不想将文件安装到本机并排程序集缓存中(例如,因为您的安装程序不需要管理员权限),则需要修改二进制文件( MAuEASE_s.dll 在你的情况下)。为此,您可以首先检索原始清单(参见上文),通过删除相应的程序集引用来更新清单,并替换原始的 RT_MANIFEST 资源(使用资源编辑器,如Visual Studio或Mt. EXE):

mt.exe -manifest manifest_new.txt -outputresource:<filename of binary>

完成后,您可以将DLL与引用它们的二进制文件一起部署。请注意,这不再允许您链接到特定版本的DLL。

答案 2 :(得分:0)

正如xMRi和IInspectable建议的那样,我能够修改DLL中的清单以强制加载我放在可执行文件目录中的特定DLL。但它并没有解决问题。每当我在新PC上启动应用程序时,我都会收到以下错误:

  

应用程序无法正确启动(0xc0150002)。

在我的开发机器中,我安装了大量的Visual C ++可再发行版本,并在Windows目录中找到了几个版本的mfc80.dllmsvcr80.dll。我逐个复制了这两个不同版本文件的所有可能组合,并尝试启动该应用程序。但无效

做了什么是(我想避免的) - 我从控制面板打开了卸载程序窗口。在那里,我发现安装了3个不同版本的Visual C ++ 2005可再发行组件:

  • 8.0.61001
  • 8.0.50727.42(这是x64版本)
  • 8.0.56336

我开始在网上寻找这些安装程序。在新PC上,我开始逐个安装可再发行组件并尝试启动应用程序。最后我发现在安装8.0.61001版本(即带有MFC安全更新的Visual C ++ 2005可再发行SP1)后,应用程序已成功启动。

现在,我将在应用程序的安装程序中打包此可再发行组件的安装程序。