WinSxS技术

By | 09月15日
Advertisement

今天,我这里处理了一个WinSxS版本混乱导致的应用程序无法加载的问题。

环境如下:

  • 有一个EXE文件,不依赖任何的运行库
  • 有很多DLL文件,分别在EXE文件目录的子目录下
  • EXE文件所在目录下有一套安装的VC8运行库
  • DLL文件需要依赖VC8运行库
  • 因为各种原因,没有使用 vcredist_x86.exe 把VC8运行库安装到Windows\WinSxS目录下面

使用的时候发现,EXE文件加载DLL的时候,总是提示加载失败。DLL无法启动。我用 Process Monitor 监视了一下文件的读写操作,发现EXE文件在加载DLL的时候,CSRSS总是去读取 Windows\WinSxS 目录下的运行库文件,由于没有使用 vcredist_x86.exe 把VC8运行库安装到Windows\WinSxS目录下面,因此DLL加载失败了。

我很奇怪的问题是,为什么总是忽略了EXE目录下的manifest文件,而总是使用 Windows\WinSxS 目录下的文件呢?

以前知道manifest文件可以外置,也可以内置到PE文件的资源里面,难道是内置的问题吗?用Resource Hacker打开DLL文件,果然发现了内置的清单文件。把这个资源结点删除以后,保存退出,然后再使用EXE文件加载这个DLL文件,OK~问题解决 了。这次使用的是EXE目录下的运行库文件而没有使用Windows\WinSxS目录下的文件了。

BTW:对于开发人员来说,自然不能编译以后再手工删除这个资源结点,解决方法很简单,把工程的 manifest设置里面的 embedded manifest 功能关闭掉,这样编译以后就会出现编译生成的目标文件和一个额外的manifest文件。使用的时候,系统会首先尝试到Windows\WinSxS目录 下面寻找文件,如果文件不存在,那么会在EXE文件所在目录下寻找,而不是去DLL所在目录下寻找文件。

问题解决以后,就需要想想问什么只有在部分系统上面出现这个问题了,检查发现:没有问题的系统都使用vcredist_x86.exe 把VC8运行库安装到Windows\WinSxS目录下面了,有问题的系统,发现WinSxS目录下没有运行库文件,自然不能使用了。

目前,很多软件都使用了VC8开发,而且都使用 vcredist_x86.exe 把VC8运行库安装到Windows\WinSxS目录下面,但是有某些软件在卸载的时候,又把这个运行库卸载了,结果就会导致类似提示“由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题”的错误的出现。这是最常见的一种现象。另外还有下面的几种可能会导致WinSxS混乱:

  • manifest文件被破坏
  • 复制了错误的manifest文件到错误的目录,导致manifest文件里面记录的内容和实际的DLL版本不符

最后,如果你碰到提示“由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题”,最佳的操作方法是看看这个文件依赖的运行库是否齐备,如果不会看,最简单的办法就是重新安装所有的运行库版本到系统里面。

下面是所有常见的32位运行库版本的下载地址:

  • 适用于 Visual C++ 2005 开发的程序的运行库版本:http://www.microsoft.com/downloads /details.aspx?FamilyID=32bc1bee-a3f9-4c13-9c99-220b62a191ee&displaylang=zh-cn
  • 适用于 Visual C++ 2005 SP1 开发的程序的运行库版本:http://www.microsoft.com/downloads /details.aspx?familyid=200B2FD9-AE1A-4A14-984D-389C36F85647&displaylang=zh-cn
  • 适用于 Visual C++ 2008 开发的程序的运行库版本:http://www.microsoft.com/downloads /details.aspx?familyid=9B2DA534-3E03-4391-8A4D-074B9F2BC1BF&displaylang=zh-cn
  • 适用于 Visual C++ 2008 SP1 开发的运行库版本:http://www.microsoft.com/downloads /details.aspx?familyid=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2&displaylang=zh-cn

如果你不知道你使用的程序是什么版本开发的,那么就全部安装吧,嘿嘿~

BTW:WinSxS 技术从 Windows XP 开始引入,一直发扬到 Windows Vista 系统里面,表现形式就是随着系统使用时间的增加,Windows\WinSxS 目录会越来越大,这一点在 Windows Vista 系统里面会特别突出,因为 Windows Vista 系统的系统文件都是使用 WinSxS 目录存放的,Windows\System32 目录下看到的大部分文件实际上是 WinSxS 目录下文件的一个 Hard Link 而已 :)

Similar Posts:

  • 为Windows 7的winsxs文件夹瘦身,慎重。

    刚使用Win7 系统不久,前段时间在清理系统垃圾时发现,win7系统的windows目录下的winsxs 目录占用空间非常大,想清理之,却提示无权限无法清理.随即在网上查了个究竟,原来winsxs是一个超大的文件仓库,系统所在分区几乎所有的系统文件都在那里至少有一个备份.而且随着系统的使用,winsxs的所占的空间还将不断的积累壮大,最终将吞噬整个系统分区的磁盘空间.下面附上搜索来的一篇winsxs的详细描述文摘.winsxs的瘦身方法和一篇关于 DLL Hell问题 的描述文摘和大家分享: w

  • 为Windows 7的winsxs目录瘦身,谨慎。

    刚使用Win7 系统不久,前段时间在清理系统垃圾时发现,win7系统的windows文件夹下的winsxs 文件夹占用空间很大,想清理之,却提示无权限无法清理.随即在网上查了个到底,原来winsxs是一个超大的文件仓库,系统所在分区差点儿全部的系统文件都在那里至少有一个备份.并且随着系统的使用,winsxs的所占的空间还将不断的积累壮大,终于将吞噬整个系统分区的磁盘空间.以下附上搜索来的一篇winsxs的具体描写叙述文摘.winsxs的瘦身方法和一篇关于 DLL Hell问题 的描写叙述文摘和大

  • 发一个扫盲贴,什么是WINSXS文件夹!

    从WINDOWS 98用到现在的7,自VISTA开始就出现了个莫名的winsxs文件夹(XP就有了,只是采用的技术不同了,),既不知道有什么用,也不能删除,想必很多坛友有此疑问吧,那我说说啥是winsxs. 谈到winsxs,就要从微软效仿linux而引进的一种新的文件储存方式,链接式(英文叫HARDLINK,不知汉语怎么翻译).就是说比如我有一个文件,通常我要复制它,就要用到复制粘贴,储存空间加倍.但是用HARDLINK,通俗点讲,复制的仅仅只是一个索引而已,就是说有两个文件,但是共用一个储存

  • CodeSnippet.info整体技术构架

    CodeSnippet.info整体架构 服务器端 Asp.NET MVC5 考察过MVC6,但是现在MVC6还不成熟,技术上不稳定,很多资料也比较少. 所以网站暂时使用MVC5.当然网站的大部分业务逻辑是和MVC框架脱离的,以后升级也应该不会出现很大问题. 数据库选择 数据库暂时使用MongoDB,使用MongoDB纯粹是站长的个人兴趣爱好. (MongoDB 3.2.4 WireTiger数据库引擎) MongoDB的优点和缺点十分明显 优点 1.使用MongoDB的C#官方驱动程序,天然的

  • 2013年度IT博客大赛技术50强获奖图书!

    亲爱的参赛博主: 2013年度IT博客大赛从10月31日开赛以来历时56天,经过网友海选100强,后又经过28位星光评委的点评,2013年度IT博客大赛50强诞生,他们都是出身不凡.千里挑一,不仅具备IT人的无私分享精神,而且颇具人气.技术领先.查看他们>> 以上50名IT博客主均可获得技术图书一本,在本文评论区回复你选择的图书名,先到先得噢~ 领书的同时不要忘记完善信赖用户信息噢,我们会根据信赖用户信息快递图书,请大家务必填写真实有效信息. 注意:本次选书日期为12月26日--1月15日,超

  • iOS开发之多线程技术

    本篇争取一篇讲清讲透,依然将通过四大方面清晰的对iOS开发中多线程的用法进行详尽的讲解: 一.什么是多线程 1)多线程执行原理 2)线程与进程 3)多线程的优缺点 二.我们为什么要用多线程编程技术 三.如何使用多线程技术 1)pthread技术 2)NSThread技术 2.1)线程属性 2.2)资源共享(抢夺) 3)GCD技术 4) NSOperation技术 四.线程的生命周期(线程状态) 一.什么是多线程 多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执

  • 职场思考--对产品经理岗位的技术思考(上)

    有的时候就在想,技术特别牛的人是不是会一直做技术呀!毕竟,一直习惯了自己的那个技术圈子.要从那个圈子里出来,去考虑市场,运营,行业.......一系列的问题.相当于从自己已有的一个优势中跳出来,会有多少的不习惯.但最近通过跟一些朋友的聊天才发现,对于产品经理这个职位而言.又有了一个更为深入的思考. 从市场行为倒推论技术研发 做技术的人讲究要严谨,一丝一毫的差距可能都会影响最终产品的性能.而做产品经理,你所要考虑的就不仅仅是技术.换一个角度来说,对技术,你可以要求细节.但对一些看似反常的市场行为来

  • [.net 面向对象程序设计进阶] (14) 缓存(Cache) (一) 认识缓存技术

    [.net 面向对象程序设计进阶] (14) 缓存(Cache)(一) 认识缓存技术 本节导读: 缓存(Cache)是一种用空间换时间的技术,在.NET程序设计中合理利用,可以极大的提高程序的运行效率. 本节将介绍如何利用缓存写出高效率的代码. 1. 什么是缓存(Cache)? 缓存(Cache)是一种用空间换取时间的技术 存在于计算机中很多地方,用来将一些慢速设备中的常用数据保存在快速设备中,取数据的时候直接从快速设备中取. 比如CPU二级缓存.内存.windows文件读取缓存. 2. .NE

  • 高煥堂的课程:软件接口设计的技术与艺术

    课程:软件接口设计的艺术与技术 API决定控制权,谁拥用接口制定权,谁就掌握控制点,就能获得较大的话语权,从API看控制力量的强弱等级.本课程提供您最新进的接口设计思维.方法和技术,活用EIT造形来有利的强势接口,让自己的产品取得核心地位,也让自己企业能够在整个产业生态里取得高度的话语权. 讲师:高焕堂 ~Day-01~ Part-1.从编程到接口设计的学习步骤 -- 从编程到设计之路:编程→接口设计→架构设计 -- 温故:过去先写类,再提供接口 -- 知新:现再先设计接口,再写类 -- 途径(

  • 硬盘接口技术大观园

    来自存储老吴的博客--存储之道 目录 古老的磁盘接口... 1 IDE接口... 1 SCSI接口... 3 FC接口... 4 串行ATA接口... 5 SATA接口... 6 mSATA接口... 8 SATA Express. 10 串行SCSI接口... 10 SAS接口... 10 SAS内部连接线缆... 13 SAS外部互连线缆... 17 NVMe SSD接口... 21 SFF-8639. 21 M.2接口... 22 硬盘技术发展至今,历经了多次接口技术的发展和变革,存储老吴

Tags: