【问题标题】:Manifest. Error executing binary in release version显现。在发布版本中执行二进制文件时出错
【发布时间】:2011-03-24 18:27:23
【问题描述】:

我正在使用 Visual Studio 2005 在 Windows XP 中开发二进制文件。我已经生成了我的应用程序的调试和发布版本,并且在我的机器上一切正常。但是,当我尝试在另一台机器上运行应用程序时,调试版本运行良好(我认为是因为我在两台机器上都有相同的 Visual Studio),但发布版本执行时出现问题(我有相同版本的可再发行组件) . 在 Stackoverflow 中阅读此处,我已将嵌入式清单设置为 no,当我生成我的应用程序时,我可以看到我的发布清单,其内容是这样的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

  <dependency>

    <dependentAssembly>

      <assemblyIdentity type="win32"
       name="Microsoft.VC80.CRT" 
       version="8.0.50727.762" 
       processorArchitecture="x86" 
       publicKeyToken="1fc8b3b9a1e18e3b">
      </assemblyIdentity>

    </dependentAssembly>

  </dependency>

  <dependency>

    <dependentAssembly>

      <assemblyIdentity type="win32" 
       name="Microsoft.VC80.MFC" 
       version="8.0.50727.762" 
       processorArchitecture="x86" 
       publicKeyToken="1fc8b3b9a1e18e3b">
      </assemblyIdentity>

    </dependentAssembly>

  </dependency>

  <dependency>

    <dependentAssembly>

      <assemblyIdentity type="win32" 
       name="Microsoft.VC80.CRT" 
       version="8.0.50727.4053" 
       processorArchitecture="x86" 
       publicKeyToken="1fc8b3b9a1e18e3b">
      </assemblyIdentity>

    </dependentAssembly>

  </dependency>

</assembly>

如果我删除了目标计算机清单中的最后一个条目 8.0.50727.4053,我可以成功运行应用程序,但是为什么要将此条目添加到清单中?如何删除它?

问候

【问题讨论】:

    标签: c++ windows visual-studio-2005 manifest


    【解决方案1】:

    清单是 Microsoft 对其 DLL 地狱的解决方案。您的程序使用的每个库都有一个 (libname, version) 条目,以便 Windows 可以加载正确的版本。

    关于删除:

    如果您的 VS 版本能够将 MFC 和 CRT 库静态链接到可执行文件中,您可以尝试。然后这些项目应该从清单中消失。

    如果您不能静态链接并且您可以完全控制您的运行时环境,那么您可以在没有 .manifest 文件的情况下直接发布。当您无法控制自己的 runitme 环境时,最好为您的应用程序创建一个安装程序,它会捆绑所需的库。

    【讨论】:

    • 是的,但是我可以做些什么来删除清单的这个 8.0.50727.4053 条目?以及为什么我的应用在没有此条目的情况下运行???
    【解决方案2】:

    当您在 VS2005 中使用 DLL 运行时构建项目时,编译器会自动包含用于将相关组件条目添加到最终清单的信息。

    这里发生的事情可能是由于您包含了一个使用 VS2005 RTM 构建的静态库项目,而现在您正尝试使用 VS2005 SP1 构建一个项目。

    您的解决方案是:

    • 使用最新的 VS2005 重新构建项目中的静态库,以便所有相关程序集都指向相同的最新版本。

    • 仅重建您的 EXE,并带有强制它引用 RTM 运行时的选项。说明是here

    • 完全禁用自动清单,只需发送一个手工制作的清单,其中只有一个dependentAssembly CRT 参考,这是您首选的 CRT 版本。

    【讨论】:

      猜你喜欢
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      • 1970-01-01
      • 2016-09-19
      相关资源
      最近更新 更多