在VC++2008的项目中,如何显示地指定要使用的C++库的版本?开发环境: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未果,特此请教高人~~
因为我的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未果,特此请教高人~~
解决方案 »
- 高手请指教,DirectX开发问题:在播放时使用pMS->SetPositions后,无法进入HandleGraphEvent中,无法判断文件已经播放结束
- z字符的输出 下面的情况怎样做
- 郁闷,CListCtrl的LVS_ICON和LVS_EDITLABELS是不是相冲突啊?
- 请问基于对话框的程序可以开发odbc的数据库程序吗?
- //给个完整hook api的例子。
- 进程间通信有那几种方法?
- 关于ActiveX控件的疑惑?
- 怎样在VB中控制WORD!多谢指教
- 关于CoInitializeEx配置组件环境
- 怎么减小应用程序的大小啊?
- std vector erase 遍历删除问题
- 字符替换的效率问题
所有SideBySide部署的DLL都被安装在c:\windows\winsxs文件夹下,这种方式的优点是可以在同一个系统下安装不同版本的DLL,并采用版本映射的方式来定位实际需要加载的DLL,直接复制的DLL是没有版本映射的。版本映射是在一个独立的XML文件中描述的,你可以看看带Policy字样的文件内容。在同一个大版本情况下(比如9.0),旧的小版本可以映射到新的小版本(比如你在manifest中指定的是21022.8,可以自动映射到30729.1)。
应用程序中的MANIFEST文件[使用了使用了新版本DLL的功能 却指定了旧的版本号] + 旧版本的运行库MANIFEST文件 + 新版本的运行库DLL --> 可以运行
并且,直接拷贝DLL是肯定有用的,不要POLICY文件也是可以的;但前提是要把相应的清单文件和DLL都复制到一起。我就是不太明白,为什么 旧版本的运行库MANIFEST文件 + 新版本的运行库DLL 反而可以运行呢???
程序的清单文件不要内嵌,而使用外置的MANIFEST文件,然后手工把生成的text1.exe.manifest中的version='9.0.21022.8'改成新版本号version='9.0.30729.1' ,就可以达到以下目标了:
应用程序 外置的MANIFEST文件[使用了使用了新版本DLL的功能 却指定了新的版本号] + 新版本的运行库MANIFEST文件 + 新版本的运行库DLL --> 可以运行!不过有个外置的文件,确实不爽啊。。jameshooo,您知道有什么方法可以修改内嵌清单文件中的版本号吗??
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=361682
这的确是个BUG,具体什么时候会修复就不知道了。。所以,内嵌清单中的版本号只能为旧版本号,因此目前只能用,旧版本的运行库MANIFEST文件 + 新版本的运行库DLL ,才可以运行独立发布的程序了
(当然也要筛选,如果你没用到CRT MFCLOC OPENMP,就不用拷贝了)
全部文件采用Winrar固实压缩后 才4.2M,复制到目标文件即可然后你使用Release发布程序,然后发布只要exe和dll就可以了运行的exe程序根本不需要manifest文件我列一个清单给你WinSxS
├─Manifests
│ x86_Microsoft.VC90.ATL_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_312cf0e9.cat
│ x86_Microsoft.VC90.ATL_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_312cf0e9.manifest
│ x86_Microsoft.VC90.ATL_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_d01483b2.cat
│ x86_Microsoft.VC90.ATL_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_d01483b2.manifest
│ x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_d08d0375.cat
│ x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_d08d0375.manifest
│ x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30411.0_x-ww_71382c73.cat
│ x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30411.0_x-ww_71382c73.manifest
│ x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_6f74963e.cat
│ x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_6f74963e.manifest
│ x86_Microsoft.VC90.MFCLOC_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_11f3ea3a.cat
│ x86_Microsoft.VC90.MFCLOC_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_11f3ea3a.manifest
│ x86_Microsoft.VC90.MFCLOC_1fc8b3b9a1e18e3b_9.0.30411.0_x-ww_b29f1338.cat
│ x86_Microsoft.VC90.MFCLOC_1fc8b3b9a1e18e3b_9.0.30411.0_x-ww_b29f1338.manifest
│ x86_Microsoft.VC90.MFCLOC_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_b0db7d03.cat
│ x86_Microsoft.VC90.MFCLOC_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_b0db7d03.manifest
│ x86_Microsoft.VC90.MFC_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_a173767a.cat
│ x86_Microsoft.VC90.MFC_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_a173767a.manifest
│ x86_Microsoft.VC90.MFC_1fc8b3b9a1e18e3b_9.0.30411.0_x-ww_421e9f78.cat
│ x86_Microsoft.VC90.MFC_1fc8b3b9a1e18e3b_9.0.30411.0_x-ww_421e9f78.manifest
│ x86_Microsoft.VC90.MFC_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_405b0943.cat
│ x86_Microsoft.VC90.MFC_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_405b0943.manifest
│ x86_Microsoft.VC90.OpenMP_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_ecc42bd1.cat
│ x86_Microsoft.VC90.OpenMP_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_ecc42bd1.manifest
│
├─Policies
│ ├─x86_policy.9.0.Microsoft.VC90.ATL_1fc8b3b9a1e18e3b_x-ww_9e7eb501
│ │ 9.0.21022.8.cat
│ │ 9.0.21022.8.policy
│ │ 9.0.30729.1.cat
│ │ 9.0.30729.1.policy
│ │
│ ├─x86_policy.9.0.Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_x-ww_b7353f75
│ │ 9.0.21022.8.cat
│ │ 9.0.21022.8.policy
│ │ 9.0.30411.0.cat
│ │ 9.0.30411.0.policy
│ │ 9.0.30729.1.cat
│ │ 9.0.30729.1.policy
│ │
│ ├─x86_policy.9.0.Microsoft.VC90.MFCLOC_1fc8b3b9a1e18e3b_x-ww_b8438ace
│ │ 9.0.21022.8.cat
│ │ 9.0.21022.8.policy
│ │ 9.0.30411.0.cat
│ │ 9.0.30411.0.policy
│ │ 9.0.30729.1.cat
│ │ 9.0.30729.1.policy
│ │
│ ├─x86_policy.9.0.Microsoft.VC90.MFC_1fc8b3b9a1e18e3b_x-ww_4ee8bb30
│ │ 9.0.21022.8.cat
│ │ 9.0.21022.8.policy
│ │ 9.0.30411.0.cat
│ │ 9.0.30411.0.policy
│ │ 9.0.30729.1.cat
│ │ 9.0.30729.1.policy
│ │
│ └─x86_policy.9.0.Microsoft.VC90.OpenMP_1fc8b3b9a1e18e3b_x-ww_6ad67377
│ 9.0.21022.8.cat
│ 9.0.21022.8.policy
│
├─x86_Microsoft.VC90.ATL_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_312cf0e9
│ atl90.dll
│
├─x86_Microsoft.VC90.ATL_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_d01483b2
│ atl90.dll
│
├─x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_d08d0375
│ msvcm90.dll
│ msvcp90.dll
│ msvcr90.dll
│
├─x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30411.0_x-ww_71382c73
│ msvcm90.dll
│ msvcp90.dll
│ msvcr90.dll
│
├─x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_6f74963e
│ msvcm90.dll
│ msvcp90.dll
│ msvcr90.dll
│
├─x86_Microsoft.VC90.MFCLOC_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_11f3ea3a
│ mfc90chs.dll
│ mfc90cht.dll
│ mfc90deu.dll
│ mfc90enu.dll
│ mfc90esn.dll
│ mfc90esp.dll
│ mfc90fra.dll
│ mfc90ita.dll
│ mfc90jpn.dll
│ mfc90kor.dll
│
├─x86_Microsoft.VC90.MFCLOC_1fc8b3b9a1e18e3b_9.0.30411.0_x-ww_b29f1338
│ mfc90chs.dll
│ mfc90cht.dll
│ mfc90deu.dll
│ mfc90enu.dll
│ mfc90esn.dll
│ mfc90esp.dll
│ mfc90fra.dll
│ mfc90ita.dll
│ mfc90jpn.dll
│ mfc90kor.dll
│
├─x86_Microsoft.VC90.MFCLOC_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_b0db7d03
│ mfc90chs.dll
│ mfc90cht.dll
│ mfc90deu.dll
│ mfc90enu.dll
│ mfc90esn.dll
│ mfc90esp.dll
│ mfc90fra.dll
│ mfc90ita.dll
│ mfc90jpn.dll
│ mfc90kor.dll
│ mfc90rus.dll
│
├─x86_Microsoft.VC90.MFC_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_a173767a
│ mfc90.dll
│ mfc90u.dll
│ mfcm90.dll
│ mfcm90u.dll
│
├─x86_Microsoft.VC90.MFC_1fc8b3b9a1e18e3b_9.0.30411.0_x-ww_421e9f78
│ mfc90.dll
│ mfc90u.dll
│ mfcm90.dll
│ mfcm90u.dll
│
├─x86_Microsoft.VC90.MFC_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_405b0943
│ mfc90.dll
│ mfc90u.dll
│ mfcm90.dll
│ mfcm90u.dll
│
└─x86_Microsoft.VC90.OpenMP_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_ecc42bd1
vcomp90.dll