2011年6月7日星期二

关于 Side-by-Side 问题的解决

上个月回国20天,回来上班也比较忙,没有更新博客。
今天写一些关于Side-by-Side error或Side-by-Side Configuration Issues,其实我很久以前就想记录一下解决方法。

什么情况下会遇到Side-by-Side Configuration Issues呢?
如果在Win7下使用VS2008编译一个程序,然后换一台WinXP机器下运行就有可能会出现Side-By-Side errors
如下警告:
The application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem.

如果不同机器的Win7也许会有如下警告:
The application has failed to start because its side-by-side configuration is incorrect. Please see the application event log for more detail.


附注一些关于WinSxS的介绍:
百度百科:http://baike.baidu.com/view/599776.htm
维基百科:http://en.wikipedia.org/wiki/Side-by-side_assembly
WinSxS文件夹体积虽然很大,但是并不神秘。简单来说系统使用“WinSxS”(Windows Side-by-Side)文件夹来存储各个版本的Windows 组件,减少因为动态链接库(Dynamic Link Libraries,DLL)引起的配置问题(DLL hell)。


可执行文件的或DLL的manifest。可以使用UltraEdit打开来看看。Manifest information一般在文件的最后,应该可以发现类似XML格式的描述,这就是Mainfest information。
但是也可以不使用UltraEdit来打开文件找Mainfest information,可以使用Kenny Kerr 编的工具很方便地查看manifest information。请见:
http://weblogs.asp.net/kennykerr/archive/2007/07/10/manifest-view-1-0.aspx


使用这个工具随便开一个application试试,如下图所示,我们可以看到Microsoft.VC80.DebugCRT表面使用的是VS2005的Debug的C Runtime (CRT)。X86架构(processor architecture),版本为8.0.50727.762。1fc8b3b9a1e18e3b (public key token): A unique ID for C Runtime。

manifest view example

接下来我们要做的就是在%WINDIR%WinSxS里找找是否有类似x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.762_none_....这样的文件,这个文件名也就是由manifest information所组成的。
如果没有,我们就需要installer并包含这个文件,然后再安装这个installer,Side-by-Side的问题就可以解决。
 

  
延伸一下:
也许我们会想要绕开(bypass)WinSxS对于CRT/MFC/ATL DLLs的处理,可以看看这篇文章

从VC8开始,我们就有两个方式分配CRT/MFC/ATL的DLL。

1. 将DLLs和我们的application放在相同目录中并且放入一个有效的manifest对于这些DLLs
2. 安装redist.exe,并且DLL将安装到WinSxS目录
 
如果我们想要和全局的DLLs无关,我们也许会认为将DLLs放入applications目录就可以了,但是这是一个误解
其实如果DLL已经被安装在WinSxS目录,那么local的DLLs将会被忽略。
绕开WinSxS其实很简单,只要从我们编译生成的.exe和.dll中manifests中移除“publicKeyToken”就可以了。
 
接上图例子,我们只需要删除publicKeyToken="1fc8b3b9a1e18e3b"就可以了。 
 
 
 
参考以及延伸阅读:
Resolving Side-by-Side Configuration Issues:http://buffered.io/2008/05/17/resolving-side-by-side-configuration-issues/
Microsoft Visual C++ 2008 Redistributable Package (x86):http://www.microsoft.com/downloads/en/details.aspx?familyid=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en
The Secret Of Windows Vista / Windows 7 Winsxs Folder.:http://www.winvistaclub.com/f16.html
How to bypass the WinSxS for CRT/MFC/ATL DLLs:http://blog.kalmbachnet.de/?postid=80

没有评论: