由于不正确的清单,并排配置不正确

时间:2011-12-23 12:20:31

标签: c++ visual-studio-2010

我最初在libRocket论坛上提出了这个问题,但鉴于进一步调查显示这更像是一般C ++ / Visual Studio相关问题,我在这里问。

我正在运行Visual Studio C ++ 2010 Express并已将完整的Win32源代码下载到libRocket 1.2.1。我已经成功地在调试模式下编译它而没有错误或警告,我现在正试图让它在我的应用程序中运行,该应用程序是在SFML 1.6之上构建的。

我的应用程序编译时没有错误或警告针对重新编译的libRocket。但是,只要我尝试运行它,就会收到一条错误消息The application was unable to start correctly (0xc0150002). Click OK to close the application.

当我使用Dependency Walker打开我的可执行文件时,我收到以下错误:

Error: The Side-by-Side configuration information for "ROCKETCORE_D.DLL" contains errors. The application has failed to start because its side-by-side configuration is incorrect.

我发现这很奇怪,因为它还显示我的应用程序和RocketCore_d.dll,具体取决于MSVCP100D.DLL和MSVCR100D.DLL。那里没有不匹配。然后我执行了sxstrace

=================
Begin Activation Context Generation.
Input Parameter:
    Flags = 0
    ProcessorArchitecture = Wow32
    CultureFallBacks = en-US;en
    ManifestPath = Binaries\Debug\RocketCore_d.dll
    AssemblyDirectory = Binaries\Debug\
    Application Config File = 
-----------------
INFO: Parsing Manifest File Binaries\Debug\RocketCore_d.dll.
    INFO: Manifest Definition Identity is (null).
    INFO: Reference: Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8"
INFO: Resolving reference Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8".
    INFO: Resolving reference for ProcessorArchitecture WOW64.
        INFO: Resolving reference for culture Neutral.
            INFO: Applying Binding Policy.
               INFO: No publisher policy found.
                INFO: No binding policy redirect found.
            INFO: Begin assembly probing.
                INFO: Did not find the assembly in WinSxS.
                INFO: Attempt to probe manifest at C:\Windows\assembly\GAC_32\Microsoft.VC90.DebugCRT\9.0.21022.8__1fc8b3b9a1e18e3b\Microsoft.VC90.DebugCRT.DLL.
                INFO: Did not find manifest for culture Neutral.
            INFO: End assembly probing.
    INFO: Resolving reference for ProcessorArchitecture x86.
        INFO: Resolving reference for culture Neutral.
            INFO: Applying Binding Policy.
                INFO: No publisher policy found.
                INFO: No binding policy redirect found.
            INFO: Begin assembly probing.
                INFO: Did not find the assembly in WinSxS.
                INFO: Attempt to probe manifest at C:\Windows\assembly\GAC_32\Microsoft.VC90.DebugCRT\9.0.21022.8__1fc8b3b9a1e18e3b\Microsoft.VC90.DebugCRT.DLL.
                INFO: Attempt to probe manifest at Binaries\Debug\Microsoft.VC90.DebugCRT.DLL.
                INFO: Attempt to probe manifest at Binaries\Debug\Microsoft.VC90.DebugCRT.MANIFEST.
                INFO: Attempt to probe manifest at Binaries\Debug\Microsoft.VC90.DebugCRT\Microsoft.VC90.DebugCRT.DLL.
                INFO: Attempt to probe manifest at Binaries\Debug\Microsoft.VC90.DebugCRT\Microsoft.VC90.DebugCRT.MANIFEST.
                INFO: Did not find manifest for culture Neutral.
            INFO: End assembly probing.
   ERROR: Cannot resolve reference Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8".
ERROR: Activation Context generation failed.
End Activation Context Generation.

我的系统似乎缺少Visual Studio 2008运行时。它是否正确? VS2008可再发行组件的9.0.21022版实际上存在于我的系统中。但即便如此,考虑到我使用VS2010重新编译了libRocket,它不应该引用VS2010运行时吗?

我认为这个错误源于新编译的libRocket清单文件中的配置:

    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b">    </assemblyIdentity>
    </dependentAssembly>

我可以看到它的来源,因为应用程序最初是为VS2008编写的,但是如何让VS2010生成正确的清单呢?项目属性表明它正在自动生成。

请注意,此问题仅发生在调试模式下,它在发布时运行良好。我当然非常希望能够在我的开发人员系统上以调试模式运行它。

关于如何解决这个问题的任何指示非常感谢!

谢谢!

2 个答案:

答案 0 :(得分:22)

  

不应该引用VS2010运行时吗?

不,VS2010不再将CRT存储在并行缓存中。它回到c:\ windows \ system32,找不到它需要清单。微软在收到太多客户的抱怨之后改变了主意,因为客户遇到了这类问题。

  

<assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" .../>

这是你的核心问题。您的程序不仅依赖于旧版本的CRT,它也是错误的版本。无法部署CRT的调试版本,仅适用于安装了VS2008的计算机。和你的一样。

你肯定需要解决这个问题,混合CRT版本会导致除部署问题之外的更多问题。您正在使用Debug配置中的VS2008链接.obj或.lib。您需要找到生成该文件并重建它的项目,以便它使用正确的配置和CRT版本。如果您没有任何线索,那么您可以将.obj和.lib文件grep为“DebugCRT”。

答案 1 :(得分:-3)

解决您的问题@ SideBySide Error

只需在应用程序调试文件夹中复制版本的dll和manifest文件。