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文件。

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

     

  • 相关阅读:
    CodeForces 156B Suspects(枚举)
    CodeForces 156A Message(暴力)
    CodeForces 157B Trace
    CodeForces 157A Game Outcome
    HDU 3578 Greedy Tino(双塔DP)
    POJ 2609 Ferry Loading(双塔DP)
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛十六进制转换成十进制
  • 原文地址:https://www.cnblogs.com/lidabo/p/3482427.html
Copyright © 2011-2022 走看看