关于Manifest文件的问题,高手请进!

liql2007 2013-01-25 12:34:57

环境VS2005 + SP1,Project共享使用MFC库,代码生成:MD

在本机上,编译链接都可以,就是不能运行,提示程序配置不正确,印象中一般出现这种问题已由VS2005的补丁不一致引起的,就把VS除了sp1之外的补丁的全删了,问题依旧。

最近几天研究了一下manifest文件,知道exe会根据Manifest文件找相应版本的依赖库。我的程序需要依赖CRT和MFC库,但却依赖了两个版本,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.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.6195" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.MFC" version="8.0.50727.6195" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>

其中8.0.50727.762版本正是VS sp1更新出来的库的版本,在Winsxs目下能够找到相应的版本的DLL,但版本号为8.0.50727.6195的就找不到了,所以运行不了。把Manifest文件中错误的版本号改一下(或者删除错误的依赖)就可以运行了,但这不是个办法呀,重新编译后,还得重新改。

问:manifest中的依赖项具体是根据什么生成的,为什么我的会依赖两个不同版本的同一DLL?为什么会产生错误的依赖项?(编译,链接,运行都在本机)

ps:
1)工程依赖了第三方库(dll),用dependency walker工具查看这些第三方库,其所依赖的DLL都能找到。查看本工程生成的exe,就会提示找不到CRT80和MFC80这两个DLL,所以觉得还是因为Manifest文件引起的,不是第三方库引起的。

2)用VS2005 + sp1重新新建一个新的的MFC程序,依赖项就正确,只依赖了8.0.50727.762版本,程序能够正常运行,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.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.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>
...全文
783 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2015-06-18
  • 打赏
  • 举报
回复
把Manifest文件删掉,重新编译一下
zgl7903 2015-06-18
  • 打赏
  • 举报
回复
为什么不用MFC静态链接库, 这样环境依赖性就少很多啊
梦殇奈何 2015-06-17
  • 打赏
  • 举报
回复
卸载vs 2005的补丁security update for vs2005 teamsuit就好了
kobe8free 2013-10-16
  • 打赏
  • 举报
回复
如果用VS开发,可以Set通过porperty->configuration properties->linker->manifest file->Generate manifest To Yes来自动创建manifest来指定系统的和CRT的assembly版本。 除了这样产生外部的manifest file,还有embedded manifest信息可以被写到所生成的二进制文件内 Set porperty->configuration properties->manifest tool->embed manifest To Yes 指明"8.0.41204.256-8.0.50608.0"都被定向到8.0.50727.42。这是assembly提供商如MS对低级版本bug的修正而提供的解决方法。除此之外,你也可以用application config文件来对本程序做assembly的重定向。如在你bin local文件夹下 yourbin.extention.config: <configuration> <windows> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC80.ATL" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> <bindingRedirect oldVersion="8.0.41204.256-8.0.50608.0" newVersion="8.0.50727.42"/> </dependentAssembly> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/></assemblyIdentity> <bindingRedirect oldVersion="8.0.41204.256-8.0.50608.0" newVersion="8.0.50727.42"/> </dependentAssembly> </assemblyBinding> </windows> </configuration> 参考文章 http://blog.csdn.net/fanchuan0077/article/details/5627218
  • 打赏
  • 举报
回复
同问 为毛 最近也发现了 也是这么弄才好的 你搞懂没?????

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧