由于应用程序配置不正确,应用程序未能启动
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了由于应用程序配置不正确,应用程序未能启动相关的知识,希望对你有一定的参考价值。
安装一个软件CA行助手,安装完打开出现C:program file /行助手/caassistant/由于应用程序配置不正确,应用程序未能启动,重新安装应用程序可能纠正这个问题。我已在电脑上打过vcredist_x86.exe补丁,可还是不行,将软件放到另一台电脑上安装,能正常安装使用。请求大家的帮忙(重要一点,在出问题饿机器上安装时,软件安装的很快)
首先总结一下“由于应用程序配置不正确,应用程序未能启动”这类问题出现的原因:
在Windows XP SP2以后,Windows引入了Side-by-Side执行的概念,这个概念本来是.NET提出来的,但是Windows后来将这个概念集成到操作系统层面上来了。大家都应该知道Dll Hell的问题,为了解决Dll Hell问题,Side-By-Side提出不同版本的dll文件可以同时存在于同一个系统里面,而且依赖于不同版本dll的应用程序在运行的时候可以使用到它当初被编译生成的dll。举个例子:
1、假定编写了一个C++程序A,是使用MFC 8.0(这个版本是随着Visual Studio 2005)发布的。
2、之后机器升级了Visual Studio的版本,从2005升级到2008,2008的MFC库是9.0版本的,这个时候操作系统里面安装了两个版本的MFC,分别是8.0和9.0。
3、用Visual Studio 2008编写了另外一个C++程序B,B依赖与MFC 9.0。
4、如果运行程序A的话,操作系统会将MFC 8.0加载到A的进程里面。
5、如果这时同时运行程序B,操作系统会将MFC 9.0加载到B的进程里面。这就是Side-by-side的执行概念。
操作系统之所以能够这样做,是因为它在加载程序A和B之前,除了查看PE格式里面A和B所依赖的Dll信息,都会查看A和B的manifest文件。Manifest文件保存了Windows可执行文件(包括exe和dll文件)要运行起来的环境设置信息,文件名一般是可执行文件的文件全名加上.manifest。例如notepad.exe的manifest文件就应该是notepad.exe.manifest。另外有的程序将manifest文件直接嵌入到可执行文件的资源里面了,这也就是为什么有的时候看不到程序的manifest文件的原因。通常来说,一个manifest文件的内容大致如下:
<?xml version=\'1.0\' encoding=\'UTF-8\' standalone=\'yes\'?>
<assembly xmlns=\'urn:schemas-microsoft-com:asm.v1\' manifestVersion=\'1.0\'>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level=\'asInvoker\' uiAccess=\'false\' />
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type=\'win32\' name=\'Microsoft.VC90.DebugCRT\' version=\'9.0.21022.8\'
processorArchitecture=\'x86\' publicKeyToken=\'1fc8b3b9a1e18e3b\' />
</dependentAssembly>
</dependency>
</assembly>
上面的例子里面,就说明这个程序依赖于CRT 9.0,而且是调试版的,CPU架构是32位的CPU。对于将manifest文件嵌入到资源文件的程序也有办法看到manifest的信息。
1、一种是使用mt.exe(Visual Studio自带的manifest处理程序):
mt -inputresource:test.exe;#1 /out:test.manifest
2、另外一种是使用dumpbin程序将整个exe的内容打印到一个文件,然后用文本编辑器打开,搜索Assem字符串样式就能找到manifest信息:
知道了程序依赖于具体哪一个dll以后,可以将所依赖的dll拷贝到程序的安装文件夹里面,以CRT库绑定失败为例,介绍解决步骤:
1、从上例中知道程序依赖的Microsoft.VC90.DebugCRT库,版本号是9.0.21022.8,需要32位机器版本的CRT。这个依赖项一般是因为程序是调试版,所以Visual Studio在编译的时候,将调试版的CRT加入程序的依赖项。
2、从Visual Studio的安装文件夹里面将D:"Program Files"Microsoft Visual Studio 9.0"VC"redist"Debug_NonRedist"x86中的Microsoft.VC90.DebugCRT整个文件夹拷贝到应用程序所在的文件夹里面,注意:
a) 如果程序依赖的是32位的CRT,则要拷贝x86文件夹里面的Microsoft.VC90.DebugCRT文件夹,如果是先x64程序,则要拷贝x64文件夹里面。
b) 需要确定Microsoft.VC90.DebugCRT文件夹里面的Microsoft.VC90.DebugCRT.manifest文件里面保存的版本信息而程序依赖的版本信息匹配,Microsoft.VC90.DebugCRT.manifest里面的版本信息大版本号一定要一致,小版本号一定要等于或者大于你程序依赖的CRT的小版本号。比如上例中,我们的程序是依赖于CRT 9.0.21022.8,而Microsoft.VC90.DebugCRT.manifest的版本是9.0.30729.1,这样是可以的;而8.0.30729.1就会有问题。如果大版本号一样,小版本号不一致的话,一个比较简单的方案就是修改程序的manifest文件,使其互相匹配就可以了。
3、如果程序不是依赖调试版本的CRT,而是release版本的CRT,直接去微软的官方网站下载一个crt redist包安装上就可以了。
参考技术A 如何解决"应用程序无法启动,因为应用程序的并行配置不正确"问题
应用程序事件日志中:
“C:\windows\system32\test.exe”的激活上下文生成失败。找不到从属程序集 Microsoft.VC80.MFC,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.762"。请使用 sxstrace.exe 进行详细诊断。
出现这类问题,是由于VC2005编译出来的程序文件,采用了manifest方式来指定dll文件。对于win98、win2000系统,把exe文件和VC的dll连接库放到一起就成了。对于winxp、win2003系统就要麻烦的多了,VC的连接库默认是被放到了winsxs目录下。
解决办法就是:使用vcredist_x86.exe再次分发程序。
下载地址:(http://download.microsoft.com/download/7/9/8/798325b7-8993-4ef9-9148-8db9ff4187fc/vcredist_x86.exe)
对解决方案来说,VS设置成debug版本和release版本是不一样的。关键在于打包的时候的manifest所制定的路径不同。
对于部署的程序,VS有两套方案,共享并行程序集和私有程序集部署方法,前者其实就是依赖的东西在目标机的windows\winsxs目录下,后者要求程序自带
编译程序的时候,主要设置在两个地方,第一个是项目的general配置里面的MFC,第二个是项目配置里面的C/C++下面的Code Generation里面的Runtime Library设置里面。如果你的程序在修改过之后还能编译的话,那就可以了。
今天在准备发布用VS2005写的那个程序时,拷贝到我同事机器上,双击突然出现了“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题“,这个问题很让我意外,以前只出现过缺少DLL的情况,而这次出现这个问题,让我一时没办法。想想,无非是两个原因引起的,要么是他没有安装VS2005的原因,要么是我的程序里依赖了其它的一些库。于是百度一下,发现好多相关主题。我是按照这个帖子解决的:
在VS2005下用C++写的程序,在一台未安装VS2005的系统上,
用命令行方式运行,提示:
“系统无法执行指定的程序”
直接双击运行,提示:
“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”
以前用VC6和VS2003的话, 如果缺少库文件,是会提示缺少“**.dll”,但是用VS2005却没有这样的提示。
自己实验了一下,感觉以下几种解决办法是可行的:
方法一:
在类似C:\Program Files\Microsoft Visual Studio 8\VC\redi
st\Debug_NonRedist\x86\Microsoft.VC80.DebugCRT 下找到了下列文件:
msvcm80d.dll
msvcp80d.dll
msvcr80d.dll
Microsoft.VC80.DebugCRT.manifest
把这几个文件拷贝到目标机器上,与运行程序同一文件夹或放到system32下,就可以正确运行了。
其他release版、MFC程序什么的都是拷redist下相应文件夹下的文件就可以了,文件夹后都有标识!
方法二:
修改编译选项,将/MD或/MDd改为 /MT或/MTd,这样就实现了对VC运行时库的静态链接,在运行时就不再需要VC的dll了。
方法三:
工程-》属性-》配置属性-》常规-》MFC的使用,选择“在静态库中使用mfc”
这样生成的exe文件应该就可以在其他机器上跑了。
方法四:
你的vc8安装盘上找到再分发包vcredist_xxx.exe和你的程序捆绑安装。 参考技术B 回答
你好请稍等
解决方法一:1、系统的安装模块服务被禁止了,就会造成程序无法安装,会提示“应用程序无法启动,因为应用程序的并行配置不正确。”,出现这样的问题的解决方法是启用模块安装服务。先在开始菜单中,打开“控制面板”这一项。2、进入控制面板窗口后,找到“管理工具”这一项,双击进入。3、在管理工具窗口,选择“服务”这个图标,打开,进入服务编辑窗口。4、进入服务窗口后,拖动右侧的滚动条,找到“WindowsModulesInstaller”这一项,双击进入属性窗口。5、在属性窗口的“常规”下,如果“启动类型”是“已禁止”,就需要将其改为“手动”,然后按“应用”按钮。6、接着在“服务状态”下,将已停止的服务启动,按“启动”按钮,即可开启此项服务。7、服务启动后,其“服务状态”会显示为“已启动”,这时按“确定”关闭窗口,如果是因模块服务被禁止而无法安装程序,到此问题就解决了。解决方法二:1、如果在安装程序时,出现上面那样的提示,大多原因是VC++运行库有问题,要不是没安装,要不是版本不对或损坏,解决这样的问题当然是重新安装VC++运行库。由于电脑系统的不同,以及程序需要不同,安装VC++版本也有不同,VC++运行库有VC++2005,VC++2008,VC++2010,VC++2012等等。不过现在电脑上大多以VC++2008,VC++2010居多,本文只是以VC++2008为例说明。求助的网友是因QQ无法安装的问题才求助的,解决方法,先到网上下载“MicrosoftVisualC++2008(运行库)”。2、下载到磁盘文件夹后,将其解压出来,直接双击解压出的文件进行安装。这时要注意,如果是32位系统,应该安装X86的运行库,如果是64位系统,需要安装X64的运行库。3、安装完成后,到控制面板下的“添加和删除程序”中,就可以看到成功安装的VC++2008运行库。4、VC++2008运行库安装成功后,就可以安装程序了,启动QQ安装程序,将其安装到系统中。这时有一个必须注意的事项,安装后,绝对不能启动QQ程序,必须先重启电脑,等重启后,再打开QQ程序,才能成功,这一要点必须记
最好的方法重装系统
参考技术C 出现此问题,一般是因为运行时库未安装或者安装设置不正确导致的。解决方法:
在目标机器安装VCRedist_x86.exe可以解决这个问题。该文件可以在MSDN网站上下载。
地址:http://www.microsoft.com/downloads/details.aspx?FamilyId=32BC1BEE-A3F9-4C13-9C99-220B62A191EE&displaylang=en
如果是64位机器,请用x64版本和ia64版本 参考技术D 是由于Microsoft Visual C++ Redistributable Package 出问题造成的。
Microsoft Visual C++ 2008 Redistributable Package (x64) 安装 Visual C++ 库的运行时组件,使用户能够在未安装 Visual C++ 2008 的计算机上运行使用 Visual C++ 开发的 64 位应用程序。(注:飞信出问题就是这玩意出错咯,重装一下就ok)
用这个补丁:http://download.microsoft.com/download/5/9/e/59e74271-2b59-49a1-b955-96b69cc34f38/vcredist_x86.exe
打过的补丁看看版本是不是出现问题了?
vs2008部署问题
转自:http://tangxingqt.blog.163.com/blog/static/2771087220098214755269/
参考资料
1、VS2005解决"应用程序配置不正确,程序无法启动"问题
2、VS2005安装文件 "由于应用程序配置不正确,应用程序未能启动"
3、Microsoft Visual C++ 2008发布程序的部署问题
新增(先看看上面的4个链接之后,遇到问题之后再看下面的几个链接)
5、关于vs2008 sp1 C++生成的 manifest中运行库版本号的问题 (推荐1)
6、在VC++2008的项目中,如何显示地指定要使用的C++库的版本? (推荐2)
7、VC9 SP1 generates manifests with the wrong version number
ps:有人认为这是一个bug,并汇报到ms网站上,但“推荐1”认为这不是一个bug
8、VC Runtime Binding...(ms的官方blog对这个问题的解释)
关于VC运行时绑定(上面链接的中文翻译)
9、部署 (C++)(推荐,比较难看懂)
关于链接9下几个比较有用的链接:
程序集搜索顺序(英文),主要讲的是CRT、MFC等的DLL和manifest文件的部署方式
使用Program Files/Microsoft Visual Studio 8/VC/Redist目录中提供的文件将特定Visual C++程序集作为应用程序的私有程序集安装。允许没有管理员权限的用户安装应用程序或可以通过共享运行应用程序时,建议使用这种方法。有关示例,请参见如何:使用 XCopy进行部署。(摘自:选择部署方法)
总结如下:
使用vs2008/vs2008开发的程序有2种部署方法:共享并行程序集和私有程序集部署方法
所谓的共享并行程序集部署方法是指程序依赖的CRT、MFC、ATL的DLL和manifest文件位于目标机器上的c:/windows/winsxs目录中,发布程序的时候只需要将程序拷贝到目标机器上就可以了;私有程序集部署方法指的是发布程序程序的时候,将所依赖的crt、mfc、atl的dll放在程序的当前目录下
对于release版程序
比较的简单的方法是采用共享程序集的方式来部署,安装vcredist.exe (Microsoft Visual C++ 2008 SP1 Redistributable Package (x86)
也可以采用下面debug程序的私有程序集的部署方法
对于debug版本程序
◆ 若目标机器安装了VS开发环境(vs2005 sp1/vs2008 sp1),则在机器上同时也安装了共享并行程序集,包含各个版本的dll(8.0、9.0版本,位于C:/Windows/Winsxs目录下),则不需做任何的部署,直接将需要发布的程序拷贝到目标机器上就可以了,这和release版程序的发布方式是一样的
◆ 在没有安装VS开发环境(安装了vs2005 sp1/vs2008 sp1)的机器上,只能采用私有程序集的方式来部署(因为vcredist.exe只安装了release版的CRT、MFC、ATL的DLL和manifest文件,没有对应的debug版本)
已知的2种方法:(针对vs2008 sp1,安装了sp1之后,在系统上会存在两个版本的CRT、MFC、ATL的DLL:9.0.21022.8和9.0.30729.1)
1、使当前程序的manifest文件中的依赖项的版本号与vc安装目录下的redist目录下的dll的版本一致,均为9.0.30729.1
方法:
a、在编译项目时定义一个符号_BIND_TO_CURRENT_VCLIBS_VERSION,该符号定义于C:/Program Files/Microsoft Visual Studio 9.0/VC/include/crtassem.h 文件中(假设VC安装在c盘),这样使得编译后的程序的manifest依赖于CRT 9.0.30729.1版本(同样的,对于MFC也应该定义一个类似的符号,大家可以自己在VC的include目录下搜索“9.0.30729.1”或“9.0.21022.8”,就可以找到对应的定义该符号的头文件)
b、通过外部工具修改生成的exe或dll中manifest文件(好像windows sdk中的mt.exe可以做到,不过关于这个工具的资料十分的少)
2、将VC安装目录下的redist目录下(C:/Program Files/Microsoft Visual Studio 9.0/VC/redist)的Microsoft.VC90.CRT拷贝到要发布的程序的当前目录下,修改Microsoft.VC90.CRT目录中的Microsoft.VC90.CRT.manifest文件中的版本号,改成9.0.21022.8,这样使得程序误以为该目录下的vc的dll版本是9.0.21022.8(实质上仍然是9.0.30729.1版本)
说明:
1、链接4 的说法是错误的,根据我自己的实验,如果采用私有程序集的部署方法,必须保证manifest文件中的版本号都是相等的,不存在要发布的程序的manifest文件中的版本号大于等于依赖项(CRT、MFC、ATL的dll)的版本号的说法
2、采用共享并行程序集部署方式发布的程序,会自动根据所谓的“policy”(位于C:/WINDOWS/WinSxS/Policies目录下)进行跳转(由低版本号向高版本号跳转);例如程序中的manifest的版本号为9.0.21022.8,而实际上程序是用vc2008 sp1编译的(版本号为9.0.30729.1),在程序实际执行的时候,会根据
x86_policy.9.0.Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_x-ww_037be232目录下的9.0.30729.1.policy文件(可以用记事本打开该文件)中的内容选择9.0.30729.1版本的debugCRT
我个人推荐的阅读顺序:① 先看前面的4个链接,大致有点印象,知道什么是manifest、如何查看manifest文件的内容(能力强的话,也可以自己编写manifest文件)、在vc中如何查看编译过程中生成的manifest文件内容、知道C:/WINDOWS/WinSxS/目录是干什么的、知道vcredist.exe这个程序; ② 再尝试着看看链接7、8、9,这些链接的文章内容十分的晦涩,有的还是英文的,需要有点耐心看; ③ 最后仔细的看看链接5、6,并多多试验(特别推荐链接5,这个链接中的内容十分的详细)
参考资料: 应用程序配置不正确,程序无法启动 的解决方法资料收集
内容我就不copy了,大家可以自己去看,总来说产生这个问题的原因可以归结如下:
vc2005/vc2008采用了新的程序部署技术(manifest清单文件),manifest清单文件实际上类似于我们常用的makefile文件,它定义了程序运行的依赖关系(程序运行所需要的dll库的名称、版本等)。
程序运行,首先根据manifest清单文件(这个文件可以嵌入到exe或dll中,或者单独生成外部文件,可以通过vc2005/vc2008的编译选项控制:工程“属性”->“配置属性”->“清单工具”->“输入输出”->“嵌入清单文件”,选择“是”或“否”来控制)来查找程序运行需要的dll库的名称、版本等,如果所在的系统中没有程序运行所需要的dll库和相应的manifest清单文件,则弹出“应用程序配置不正确,程序无法启动”对话框。
另外要注意,由于vc2005/vc2008与.net集成,导致出现一个新的概念:在.net中,将exe、dll都看成“程序集(assemble)”,每个程序集(assemble)都附带有一个manifest清单文件,因此使得vc2005/vc2008的CRT(C 运行时库)、MFC、ATL等dll库都附带有一个manifest清单文件。
归根结底是由于老版本的系统没有我们开发的程序运行所需要的基本运行时库(2k、xp系统只有vc6的一些dll库,而没有vc2005、vc2008所需要的dll库以及相应的manifest清单文件,而在vista系统或者即将到来的windows 7系统上则包含有vc2005、vc2008的dll库和manifest清单文件)
ps:上面的那段话说的有点幼稚和简单了,这里涉及到很多的问题:程序的升级更新、vs的补丁、库的版本问题等等,不是简单的拷贝、粘贴就能解决的。。。
举个例子:(在XP SP3系统下)
使用vc2008 express sp1版(没有mfc、atl),新建一个“HelloWorld”的“win32控制台应用程序”工程,在release下编译,此时默认的编译选项:(在这里我们只关注与我们的问题相关的几个选项)
1、工程“属性”->“配置属性”->“c/c++”->“代码生成”->“运行库”
默认选项为/MD(release)、/MDd(debug),对这几个编译选项不清楚的可以参见: VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结
2、工程“属性”->“配置属性”->“清单工具”->“输入输出”->“嵌入清单文件”
默认选项为“是”(表示将manifest清单文件嵌入到程序中);当然,我们也可以选择“否”,从而单独生成一个manifest清单文件,不过这会增加不必要的依赖项,因此不建议选择“否”。
编译->链接之后在“ HelloWorld ”工程的release或debug目录下,我们能够看到一个HelloWorld.exe.intermediate.manifest清单文件(根据编译选项,见上,vc2008将manifest清单文件嵌入到了exe程序中,HelloWorld.exe.intermediate.manifest清单文件是一个临时文件,但它的内容与嵌入到exe程序的manifest文件是一样的),用文本编辑器打开该文件(用“记事本”也行,不过格式太乱,看不清楚内容,推荐使用vim或其它的文本编辑器查看),大致内容如下:
ps:在网上看到另外的一个方法,用记事本打开exe或dll程序,查看嵌入到exe或dll中的manifest清单文件,方法:“打开记事本,然后将exe或dll拖入到记事本中,当然了,肯定会出现大段的乱码,没关系,直接往后看,就能发现类似于下面的内容的部分”
XML语言: HelloWorld.exe.intermediate.manifest
01 <?xml version=‘1.0‘ encoding=‘UTF-8‘ standalone=‘yes‘?>
02 <assembly xmlns=‘urn:schemas-microsoft-com:asm.v1‘ manifestVersion=‘1.0‘>
03 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
04 <security>
05 <requestedPrivileges>
06 <requestedExecutionLevel level=‘asInvoker‘ uiAccess=‘false‘ />
07 </requestedPrivileges>
08 </security>
09 </trustInfo>
10 <dependency>
11 <dependentAssembly>
12 <assemblyIdentity type=‘win32‘ name=‘Microsoft.VC90.CRT‘ version=‘9.0.21022.8‘ processorArchitecture=‘x86‘ publicKeyToken=‘1fc8b3b9a1e18e3b‘ />
13 </dependentAssembly>
14 </dependency>
15 </assembly>
我们重点查看红色部分,这说明编译后的exe程序依赖于vc90(也即vc2008)的CRT(C运行时库),版本9.0.210022.8(这是由于使用/MD选项,程序动态的依赖于CRT,如果使用/MT选项,则会将CRT静态链接到程序中,当然,这会使程序的尺寸急剧的增长,大概有10倍的大小差距)
当exe程序执行时,它会根据嵌入的manifest文件查找相应的依赖项,在这个HelloWorld.exe程序中,它依赖于vc90 CRT,因此它会在“C:/WINDOWS/WinSxS”和“当前目录”下查找相应的dll库以及manifest文件,(这里指的是xp系统,不考虑vista系统,具体的参见:程序集搜索顺序)
在我的机器上有2个版本的vc90 CRT(由于安装了vc2008 express sp1)
vc90 CRT的dll库位于(9.0.21022.8版本)“C:/WINDOWS/WinSxS/x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_d08d0375”
相应的manifest文件则位于“C:/WINDOWS/WinSxS/Manifests/x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_d08d0375.manifest”
vc90 CRT的dll库位于(9.0.30729版本)“C:/WINDOWS/WinSxS/x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_6f74963e”
相应的manifest文件则位于“C:/WINDOWS/WinSxS/Manifests/x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_6f74963e.manifest”
在这里我们就有一个疑问了,我们的开发环境是vc2008 express sp1,那么我们的程序链接的CRT版本应该是9.0.30729版本的啊?(这个不是我瞎说的,大家可以用dependency walker来查看程序实际链接的DLL版本),为什么在manifest文件中依赖的CRT却是9.0.21022.8版本的?这里就涉及到一个新的名词“policy ",操作系统会根据C:/WINDOWS/WinSxS/Policies/x86_policy.9.0.Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_x-ww_b7353f75/9.0.30729.1.policy文件的内容,进行dll版本的跳转(重点看深蓝斜体字部分)从而选择了9.0.30729版本的vc90 CRT (这个所谓的“policy跳转”是道听途说来的,具体的英文资料藏在microsoft的什么地方我就不得而知了。里面夹带了一些我自己的主观猜测,不然的话,没有办法解释manifest版本号9.0.21022.8是,而实际链接的dll的版本号却是9.0.30729)
XML语言: 9.0.30729.1.policy
01 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
02 <!-- Copyright (c) Microsoft Corporation. All rights reserved. -->
03 <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
04 <assemblyIdentity type="win32-policy" name="policy.9.0.Microsoft.VC90.CRT" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/>
05 <dependency>
06 <dependentAssembly>
07 <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/>
08 <bindingRedirect oldVersion="9.0.20718.0-9.0.21022.8" newVersion="9.0.30729.1"/>
09 <bindingRedirect oldVersion="9.0.30201.0-9.0.30729.1" newVersion="9.0.30729.1"/>
10 </dependentAssembly>
11 </dependency>
12 </assembly>
如果我们将这个HelloWorld.exe拷贝到其它的机器上(没有安装vc2008 sp1或Microsoft Visual C++ 2008 SP1 Redistributable Package (x86)),则程序因为没能找到vc90 CRT,而不能运行,弹出“应用程序配置不正确,程序无法启动”对话框。
根据参考资料的文章中的内容,对于release版程序,有一个简单的办法就是安装“vcredist_x86.exe”,文件大小4M左右,自动安装在“C:/WINDOWS/WinSxS”目录下,包含了CRT、MFC、ATL等库的dll和manifest清单文件;整个安装时间不到1分钟。
如果机器上安装了vc2005/vc2008,则会自动的安装vcredist_x86.exe程序,安装后在“控制面板”->“添加删除程序”中有一项“Microsoft Visual c++ 2008 Redistributable - x86 9.0.3.729”(我安装的是Microsoft Visual C++ 2008 SP1 Redistributable Package (x86) 版本)
注意:要根据编译器版本以及vc2005/vc2008是否安装了sp1补丁进行选择对应的vcredist.exe版本
上述的解决办法我称之为共享程序集部署方法,同样的我们也可以采用私有程序集的部署方式来发布程序。
Helloworld例子的私有程序集的部署方法:(针对release版本,仍然是采用上面的例子
,采用参考资料中提到的第2中私有程序集部署方法:将Microsoft.VC90.CRT目录下的manifest文件的版本号修改为9.0.21022.8)
1、将编译后的程序拷贝到一个目录下,假定为d:/helloworld
2、将vc安装目录下的redist/x86目录下的Microsoft.VC90.CRT目录拷贝到d:/helloworld(假定vs安装在C:/Program Files/Microsoft Visual Studio 9.0,则vc安装目录为C:/Program Files/Microsoft Visual Studio 9.0/VC)
3、将Microsoft.VC90.CRT目录下的manifest文件的版本号修改为9.0.21022.8(用记事本打开修改)
最终发布程序的目录结构
D:/helloworld
|--helloworld.exe
|--Microsoft.VC90.CRT
|--Microsoft.VC90.CRT.manifest
|--msvcm90.dll
|--msvcp90.dll
|--msvcr90.dll
这个时候,程序的manifest文件(已经内嵌到exe中了)依赖的vc90 CRT的版本号和Microsoft.VC90.CRT.manifest文件的版本号对应一致,都是9.0.21022.8(但是要注意的是,我们的helloworld程序实际上依赖的vc90 CRT版本是9.0.30729版本,这里只是采用了一种欺骗的方法,因为我们编译时链接的CRT的版本是9.0.30729版本)
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow