none
在VC++2008的项目中,如何显示地指定要使用的C++库的版本? RRS feed

  • 问题

  • 开发环境:VS2008 SP1 + WINXP SP2
            因为我的VS2008安装了SP1补丁,所以有了9.0.30729.1的MFC库文件(MFC90.DLL MSVCR90.DLL)。


    新建了一个MFC应用程序,编译为RELEASE版本,叫做“test1.exe”,可以从程序中的清单文件(manifest)看到以下内容:
    ...
     
    <dependency>
       
    <dependentAssembly>
         
    <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
       
    </dependentAssembly>
     
    </dependency>
     
    <dependency>
       
    <dependentAssembly>
         
    <assemblyIdentity type='win32' name='Microsoft.VC90.MFC' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
       
    </dependentAssembly>
     
    </dependency>
    ...

    说明本程序需要引用版本号为9.0.21022.8的MFC库和运行时库。

    问题一:为什么程序在运行的时候,载入的不是9.0.21022.8版本的却是9.0.30729.1版本的运行库?这是在哪里进行设置的?如何改变这个版本号?

    问题二:(虽然貌似已经解决,但是我想知道的更深一点)
    布署的时候,把X:\VS安装目录\VC\redist下对应的运行库和.manifest文件(都是9.0.30729.1版本的)复制到与test1.exe同一目录下。在一台完全干净的新系统中,会出现“应用程序配置不正确,应用程序未能启动”的错误。

    后来,经过不断的试验,发现应用程序中的MANIFEST文件指定的是9.0.21022.8版本的运行库,然后我使用9.0.21022.8版本的Microsoft.VC90.CRT.manifest文件替换9.0.30729.1版本的Microsoft.VC90.CRT.manifest,配合上30729版本的MFC90.DLL,程序就可以正常运行了。

    如果以上说的还不清楚的话,说的简单一点,就是,对于一个使用了新版本DLL功能的应用程序,有以下情况:
    应用程序中的MANIFEST文件[使用了使用了新版本DLL的功能 却指定了旧的版本号] + 新版本的运行库MANIFEST文件 + 新版本的运行库DLL --> 不可以运行
    应用程序中的MANIFEST文件[使用了使用了新版本DLL的功能 却指定了旧的版本号] + 旧版本的运行库MANIFEST文件 + 旧版本的运行库DLL --> 不可以运行
    应用程序中的MANIFEST文件[使用了使用了新版本DLL的功能 却指定了旧的版本号] + 旧版本的运行库MANIFEST文件 + 新版本的运行库DLL --> 可以运行

    注:运行库MANIFEST文件是指Microsoft.VC90.CRT.manifest和Microsoft.VC90.MFC.manifest,运行库DLL是指MSVCR90.DLL MFC90.DLL

    出现这种现象的原因是什么?我遍寻MSDN未果,特此请教高人~~

     

    //================额外的小实验====================

    又做了个实验:
    程序的清单文件不要内嵌,而使用外置的MANIFEST文件,然后手工把生成的text1.exe.manifest中的version='9.0.21022.8'改成新版本号version='9.0.30729.1' ,就可以达到以下目标了:
    应用程序 外置的MANIFEST文件[使用了使用了新版本DLL的功能 却指定了的版本号] + 新版本的运行库MANIFEST文件 + 新版本的运行库DLL --> 可以运行!

    不过有个外置的文件,确实不爽啊。。。。。

    请问有谁知道有什么方法可以修改内嵌清单文件中的版本号吗??

    2008年8月25日 6:12

答案

全部回复

  • 看看http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=361682
    2008年8月25日 19:20
    版主
  • 谢谢版主的回答!

     

    看来这真的是个BUG。不过具体会在什么时候修复呢?现在有没有为这个BUG分配一个KB号码呢?到时我可以用这个号码来追踪这个补丁,嘿嘿

    2008年8月26日 3:08
  • 问题一:为什么程序在运行的时候,载入的不是9.0.21022.8版本的却是9.0.30729.1版本的运行库?这是在哪里进行设置的?如何改变这个版本号? 

    以我的VC8.0为例
    是在system32下的Microsoft.VC80.CRT.manifest文件中指定的; 版本是Microsoft.VC80.CRT.manifest的版本号, 而不是msvcr80.dll的.


    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <!-- Copyright 漏 1981-2001 Microsoft Corporation -->
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
        <noInheritable/>
        <assemblyIdentity 
            type="win32" 
            name="Microsoft.VC80.CRT" 
            version="8.0.50608.0
            processorArchitecture="ia64" 
            publicKeyToken="1fc8b3b9a1e18e3b"
        />
        <file name="msvcr80.dll"/>
        <file name="msvcp80.dll"/>
        <file name="msvcm80.dll"/>
    </assembly>
    2009年5月5日 14:26