C/C++ 独立应用程序和并行程序集疑难解答
如果找不到,加载 C/C++. /C C/C++ 应用程序会失败依赖库。 本文介绍一些常见原因 c. /C C/C++ 应用程序无法加载,并建议步骤解决问题。
如果应用程序无法加载,因为它具有清单指定在并行程序集的依赖项,并且,程序集未安装作为私有程序集在与可执行文件相同的文件夹也不在本机程序集缓存安装在 %WINDIR%\WinSxS\ 文件夹,下面的错误消息之一可能会因尝试运行该应用程序的 windows 版本,则说明。
未能初始化的应用程序正确 (0xc0000135)。
由于应用程序配置不正确,未能启动此应用程序。 重新安装该应用程序可能修复此问题。
系统无法执行指定的程序。
如果应用程序没有清单并依赖于 windows 在典型的搜索位置找到的 DLL,类似于的错误消息。一个可以显示:
- 由于未找到,则此应用程序未能启动 所需的 DLL 。 重新安装应用程序可能会修复此问题。
如果应用程序在没有 Visual Studio,因此,的计算机上部署它通过使用类似于前面部分的错误消息,请检查以下内容:
按照 理解 Visual C++ 应用程序的依赖项中介绍的步骤。 dependency walker 可显示应用程序或 DLL 的大多数依赖项。 如果您将注意到缺少一些 DLL,请安装它们在尝试运行您的应用程序的计算机。
操作系统加载程序使用应用程序清单加载应用程序所依赖的程序集。 清单还可以在二进制文件作为资源嵌入或安装为单独的文件在应用程序文件夹。 若要检查清单是否在二进制文件中,打开位于 Visual Studio 的二进制文件并查找在其 RT_MANIFEST 列出资源。 如果找不到嵌入式清单,在应用程序文件夹为名为类似 <binary_name>的文件。<extension>.manifest。
如果应用程序依赖于并行程序集,并不存在清单,则必须确保链接器生成清单项目中。 检查在 项目属性 对话框的链接器选项 生成清单 该项目。
如果清单在二进制文件中嵌入,请确保 RT_MANIFEST 的 ID 此类型的二进制文件是否正确。 有关使用哪个资源 ID 的更多信息,请参见 使用并行程序集作为资源 (窗口)。 如果清单在单独的文件中,打开它在 XML 编辑器或文本编辑器。 有关清单的更多信息,并部署的规则,请参见 指示。
备注
如果嵌入的清单和单独的清单文件,操作系统加载程序使用的嵌入式清单并忽略单独的文件。但是,在 Windows XP 中,属性是如此。单独的清单文件使用,并且嵌入式清单被忽略。
建议您在每个 DLL 嵌入清单,因为将忽略外部清单。不过,当 DLL 加载 LoadLibrary 调用时。 有关更多信息,请参见程序集清单。
检查清单中枚举所有程序集正确地安装在计算机上。 每个程序集清单中指定的名称、版本号和处理器结构。 如果应用程序依赖于并行程序集,请检查这些程序集在计算机上正确安装,以便操作系统加载程序可以找到这些元素,如 搜索顺序的程序集所述。 请记住,64 位程序集不能在 32 位进程中加载,也不能在 32 位操作系统上执行。
示例
假设有一个应用程序,appl.exe,使用 Visual C++,编译。 应用程序在 appl.exe 指示可嵌入为二进制资源 RT_MANIFEST,具有 ID 等于 1,或存储为单独的文件 appl.exe.manifest。 目录此清单类似于:
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Fabrikam.SxS.Library" version="2.0.20121.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3e"></assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>
对于操作系统加载程序,此清单表明 appl.exe 依赖于名为 Fabrikam.SxS.Library 的程序集,第 2.0.20121.0 中,为 32 位 x86 处理器结构中。 依赖并行程序集来安装作为共享程序集或私有程序集安装。
程序集清单中为共享程序集在 %WINDIR%\WinSxS\manifests\ 文件夹。 它标识程序集并列出其内容是,作为程序集组成部分的 DLL:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<noInheritable/>
<assemblyIdentity type="win32" name="Fabrikam.SxS.Library" version="2.0.20121.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3e"/>
<file name="Fabrikam.Main.dll" hash="3ca5156e8212449db6c622c3d10f37d9adb1ab12" hashalg="SHA1"/>
<file name="Fabrikam.Helper.dll" hash="92cf8a9bb066aea821d324ca4695c69e55b2d1c2" hashalg="SHA1"/>
</assembly>
即文件复制到全局的策略重定向应用程序和程序集绑定使用并行程序集的一个版本而不是同一程序集,另一版本的并行程序集还可以使用 发行者配置文件—还。 您可以检查策略在 %WINDIR%\WinSxS\policies\ 文件夹的共享程序集。 这是一个示例策略文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32-policy" name="policy.2.0.Fabrikam.SxS.Library" version="2.0.20121.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3e"/>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Fabrikam.SxS.Library" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3e"/>
<bindingRedirect oldVersion="2.0.10000.0-2.0.20120.99" newVersion="2.0.20121.0"/>
</dependentAssembly>
</dependency>
</assembly>
此策略文件指定请求此程序集的第 2.0.10000.0 版的任何应用程序或程序集应使用第 2.0.20121.0 中,是当前版本在系统上安装。 如果应用程序清单中提到的程序集的版本在策略文件中指定,加载程序查找清单中指定在 %WINDIR%\WinSxS\ 文件夹此程序集的版本,并且,如果未安装此版本中,加载将失败。 此外,如果未安装程序集第 2.0.20121.0 中,加载为请求程序集第 2.0.10000.0 版本的应用程序失败。
但是,程序集可能也会安装作为私有并行程序集在安装的应用程序文件夹。 如果操作系统未能找到程序集作为共享程序集,它将查找它作为私有程序集,按以下顺序:
检查应用程序文件夹具有名称 <assemblyName>.manifest 的清单文件。 在此示例中,加载程序请在包含 appl.exe 的文件夹的 Fabrikam.SxS.Library.manifest。 如果找到清单,加载程序从应用程序文件夹中加载程序集。 如果未找到程序集,加载将失败。
尝试打开 \<assemblyName>\在包含 appl.exe 的文件夹的文件夹中,属性,并且,如果 \<assemblyName>\ 存在,加载具有名称从此文件夹的 <assemblyName>.manifest 的清单文件的尝试。 如果找到该清单,加载程序将从 \<assemblyName>\ 文件夹中加载程序集。 如果未找到程序集,加载将失败。
有关加载程序如何的更多信息搜索依赖的程序集,请参见 搜索顺序的程序集。 如果加载程序未能找到一个依赖程序集作为私有程序集,则加载失败,并显示消息“系统无法执行指定的程序”显示。 若要解决此错误,请确保是的一部分依赖程序集和 DLL 它们安装在计算机上作为私有或共享程序集。