zoukankan      html  css  js  c++  java
  • VS2005 VS2008 Manifest 配置问题总结

    一、问题

    编译某个遗留工程后,运行程序时报错,“由于应用程序的配置不正确,应用程序无法启动。重新安装应用程序可能会解决这个问题。”

     

    查看生成的Manifest文件如下:

    <?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.DebugCRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type='win32' name='Microsoft.VC80.DebugMFC' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type='win32' name='Microsoft.VC80.DebugMFC' version='8.0.50727.6195' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
        </dependentAssembly>
      </dependency>
    </assembly>

    问题出现在第三个assemblyIdentity中version的值与机器上该dll的值不符。

    二、解决方法

    需要将manifest中第三个assemblyIdentity中version的值修改为与机器上相应dll的版本。

    查看该项目的属性发现,【连接器】->【清单文件】->【生成清单】项的值为“是”。由此可见,该manifest文件是编译器生成的。据推测,manifest中第三条assemblyIdentity信息,可能是根据该项目使用的某些dll依赖的dll版本生成的。例如,该项目用到了A.dll,而A.dll是在其他机器上编译的,编译A.dll的机器上的Microsoft.VC80.DebugMFC的版本是'8.0.50727.6195'。

    1. 如果推测是正确的,那么在本机重新编译A.dll,再重新编译程序,新生成的manifest中第三个assemblyIdentity中version的信息将会与本机中相应dll的版本信息一致,就不会报上面所说的错误信息。

    2. 可以通过不生成manifest,而使用自己写的manifest来避免这个错误。

    使用自己写的manifest,需要进行如下设置。

    1)将【连接器】->【清单文件】->【生成清单】项的值设置为“否”。表示不需要程序自己生成Manifest。

     

    2)将【清单工具】->【输入和输出】->【附加清单文件】项的值设置为自己写的manifest文件的路径。

     

    上图中include.manifest文件是自己根据程序之前生成的manifest文件改的。内容如下:

    <?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.DebugCRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    
        </dependentAssembly>
    
      </dependency>
    
      <dependency>
    
        <dependentAssembly>
    
          <assemblyIdentity type="win32" name="Microsoft.VC80.DebugMFC" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    
        </dependentAssembly>
    
      </dependency>
    
      <dependency>
    
        <dependentAssembly>
    
          <assemblyIdentity type="win32" name="Microsoft.VC80.DebugMFC" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    
        </dependentAssembly>
    
      </dependency>
    
    </assembly>

    注意第三条assemblyIdentity项中version的信息。

    3)重新生成程序后运行,即解决问题。

    3. 可否不生成manifest?

    既然生成的manifest中某些assembly的version信息与本机不符会导致程序报错,那么,能不能不生成manifest文件呢?

    答案是:否。

    在VS2005中,运行程序必须有相应的manifest。如果在项目属性的【连接器】->【清单文件】->【生成清单】中选择“否”,而在【清单工具】->【输入和输出】->【附加清单文件】项中又没有设置清单文件路径,那么生成程序时将不会生成manifest文件。

    运行程序时会报如下错误:

     

  • 相关阅读:
    汇编学习--第十天
    linux(03)基础系统优化
    linux(02)基础shell命令
    lf 前后端分离 (6) 支付
    lf 前后端分离 (5) 优惠券
    lf 前后端分离 (4) 价格策略
    lf 前后端分离 (3) 中间建跨域
    lf 前后端分离 (2) 课程数据获取,Serializer的返回
    lf 前后端分离 (1) auth,token认证
    支付宝接口调用总结(1)
  • 原文地址:https://www.cnblogs.com/lidabo/p/3482427.html
Copyright © 2011-2022 走看看