原先我用的XP SP2 + VC2005 SP1,编译出来的程序,动态链接到运行时库,编译器给我链接到的都是8.0.50727.762版本的DLL,在Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT\目录下都能找到,现在装了XP SP3以后,编译出来的程序居然全都链接到8.0.50727.1433版本上去了。我查看了一下,三个DLL的生成日期都是07年10月24日,估计是SP3带来的。但是在VC\redist下面并没有更新(另外1433版本只存在于Release版,Debug版生成的还是链接到762版)。
我现在想问的是,如何配置我的工程,让程序在链接的时候链接到762版本的DLL上面去?以下是我试过的,无效的方法:
1、manifest外置,修改manifest,将版本号改成8.0.50727.762
2、manifest内置,创建一个指向版本号8.0.50727.762的新的manifest
3、manifest内置,创建一个带有bindRedirect的新manifest
4、修改工程属性的Manifest Tool->Assembly Identity属性,在里面填上8.0.50727.762
以上方法都会造成程序无法运行,要么提示运行时库错误,要么提示程序安装错误求解!

解决方案 »

  1.   

    把762版本对应的lib导入库添加一下,然后再忽略系统的库
      

  2.   

    请问楼上,762版本对应的导入库是哪些?都放在什么地方了?我在VC\lib里面找到了msvcprt.lib和msvcrt.lib,但是它们和msvcprtd.lib、msvcrtd.lib都是06年12月1日生成的,我是不是需要手动引用到这两个库然后添加/NODEFAULTLIB参数到Linker?
      

  3.   

    没关系的,side by side部署方式会修改策略文件,里面会修改版本映射关系,即使VC自带的运行时库版本较低,策略文件里也会把低版本自动映射到高版本(大版本相同的情况下),所以实际使用的dll都是最新版本,而且保证不会出错。修改manifest文件是无用的,反而会导致在低版本操作系统上运行出错,因为找不到最新版本的dll。
      

  4.   

    1.修改清单文件的话,相应的库最好与应用程序在相同目录下。2.在 Windows XP 上,如果应用程序的本地文件夹中存在外部清单,则操作系统加载程序将使用此清单,而不使用二进制文件中嵌入的清单。在 Windows Server 2003 和 Windows 更高版本上,情况正好相反,即当存在嵌入的清单时,将忽略外部清单而使用嵌入的清单。 3.修改了清单文件的情况下,如果说应用程序运行时提示配置错误,一般是清单文件书写有错误,xp中我不知道只知道vista下会生成相应的应用程序日志,可以查出是清单文件中的哪儿出了问题。
      

  5.   

    请问3楼,你是说我在我机子上编译出来的,依赖性是8.0.50727.1433的EXE,在只有8.0.50727.762的WinXP SP2的机子上也能跑吗?
      

  6.   

    依赖高版本的情况下,在只有低版本的机器上不能跑。事实上,加载成功的必要条件是:
    1、策略文件中必须存在所需版本的映射项。
    2、映射的新版本DLL必须存在。
    如果两个条件任意一项不满足,则加载失败。这说明了两个事实:
    1、即使目标机器上存在着所需版本的DLL,但是没有添加版本映射策略,加载也会失败,所以sxs部署方式仅仅复制文件是不够的。使用vc自带的重部署包安装能正确地配置映射策略。
    2、如果目标机器上不存在所需版本的DLL,但是有更高版本的DLL,而且所需版本被映射到了高版本,那么加载也会成功。
      

  7.   

    需要安装一个微软发布的小安装包vcredist_x86,只有几兆。在没有安装Microsoft Visual Studio 2005的计算机上运行编译的程序,就需要安装它的。具体说明参见微软主页。
      

  8.   


    softmic,com haha微軟的微代表?軟代表?