在前面的Blog中有提到,VS2005及以上版本的程序发布与之前版本有一个差别就是清单文件,这个清单文件包含了运行此应用程序所需要的一些文件配置信息,如平台,版本等等,这个清单文件可以内嵌在应用程序中,也可以单独存在。在应用程序运行时就会根据这个清单文件去找相应的依赖文件,默认首先是查找系统目录下的WinSxS目录,如果找不到会在应用程序所在目录去查找。

    如果运行程序所在的机器上没有安装相应版本的VS发布包,程序就无法运行。前段时间,我用VS2008编写生成的程序,给我们一位同事使用时,就出现说程序未正确安装或者配置,无法运行。究其原因就是因为没有清单文件没有配置好。后来通过下面的方式操作,程序终于运行起来了。

  • 程序本身的清单文件,依旧选择嵌入式清单。
  • 将VS的动态连接库从WinSxS目录中复制出来,我用的VS2008,复制的是x86_microsoft.vc90.crt_9.0.21022.8_中的内容不同机器,内容可能不同)目录中的动态连接库,如果是Debug版本,请复制x86_microsoft.vc90.debugcrt_9.0.21022.8_*********中的内容,如果程序使用了MFC、ATL或者OPENMP,则需要把相应的动态连接库一起复制出来。
  • 将清单文件从WinSXS目录中复制出来,将Manifests目录下的x86_microsoft.vc90.crt_9.0.21022.8_***.manifest复制到运行程序目录,同样,如果使用了MFC、ATL或者OPENMP或者是DEBUG版本,则把相应的版本一起复制出来。
  • 将所有复制出来的清单文件更名,更名为microsoft.vc90.XXX.manifest(XXX代表复制是crt还是ATL,还是mfc,或者是debugcrt等等,与原来一样),例如:x86_microsoft.vc90.crt_9.0.21022.8_***.manifest,更名为microsoft.vc90.crt.manifest。