程序打包,"错误:应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行sxstrace.exe"工具解决办法

来源:互联网 发布:淘宝售后退款要多久 编辑:程序博客网 时间:2024/05/20 22:36

<span style="font-size:18px;">最近项目功能做完,基本测试也过了一下,程序打包,在自己的的电脑上面运行正常,但是当把程序拷贝到其他没有安装开发环境的电脑上面,程序报如下错误:</span>


 一

在网上搜索资料,http://jingyan.baidu.com/article/95c9d20d4a1726ec4e7561ff.html,根据这个解决方案,安装了所有的运行时库(2005,2008,2010,2012等)、framework,但是没有用。折磨了我快两天这个问题。

发现解决不了,只能继续在网上搜索,发现了我们清单文件和运行时库的两个选项,下面我讲解一下我用清单文件和正确安装运行时库解决这个问题的方案。

1、清单文件   

  (1)VS2005以后运行库采用清单文件来进行查找,清单文件分为嵌入和不嵌入,嵌入的将会链接到exe文件中,而不嵌入的放在exe并行目录中,可以修改

  (2)有关清单文件的设置有两个  右键》属性》链接器》清单文件》生成清单 

                                                                右键》属性》清单工具》嵌入清单

  (3)a、生成清单选择 是

            b、嵌入清单选择 否

            在生成文件里面可以找到*.exe.manifest,打开,可以发现,

<span style="white-space:pre"></span><pre name="code" class="html"><?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"></requestedExecutionLevel>      </requestedPrivileges>    </security>  </trustInfo>  <dependency>    <dependentAssembly>      <assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>    </dependentAssembly>  </dependency></assembly>

        网上网友说,版本号为9.0.21022.8,我用的是VS2008,虽然清单文件中的版本号是9.0.21022.8,但是我们项目真正加载的是9.0.30729版本,导致找不到,加载失败。还是先说按照网友们改清单文件是如何解决的吧。

     c、首先找到VS安装目录下的运行库,C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugCRT,我是安装在C盘的,并且我的是debug版本,拷贝Microsoft.VC90.DebugCRT.manifest、msvcm90d.dll、msvcp90d.dll、msvcr90d.dll这四个文件到exe目录底下,打开,Microsoft.VC90.DebugCRT.manifest,里面的版本是9.0.30729.6161,和我们自己生成的版本不一致,我们改为上面一致9.0.21022.8。这样程序就会以为我们刚刚拷贝的版本是9.0.21022.8,进而调用。   

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">    <noInheritable></noInheritable>    <assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.30729.6161" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>    <file name="msvcr90d.dll" hashalg="SHA1" hash="d57abe3cbe47c78d4a98158ed0256c540b8f1e2e"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>zSAij6xdGHXPGZt2sx3FuDliqtE=</dsig:DigestValue></asmv2:hash></file> <file name="msvcp90d.dll" hashalg="SHA1" hash="92076b706551dcfef3e0dfaefa6974b012b54bd6"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>3KjR7Y2ERz1wAb2zyiLcBQ8Jvjg=</dsig:DigestValue></asmv2:hash></file> <file name="msvcm90d.dll" hashalg="SHA1" hash="8433e3e08aeb16ae9c1fa515e265763907241e62"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>t+3q6m0V0ZpyNqL+1SNwHqhMRQs=</dsig:DigestValue></asmv2:hash></file></assembly>

d、一般如果是VS2008+DeBug+(/MDd)这样拷贝就可以了,但是我的程序因为运行时要调用VS2010的第三方库,所以要拷贝相应版本的运行库到exe目录底下,C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x86\Microsoft.VC100.CRT,msvcp100d.dll,msvcr100d.dll

e、如果是VS2008+release+/MD版本的,C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT,拷贝这个目录下的三个文件

      VS2008+release +/MDd的,则需要同时拷贝两个版本的运行库,并修改清单文件。至于我们程序调用的第三方的dll,也要根据debug和release拷贝相应版本

f、无论是debug或者是release,反正主要是看*.exe.manifest 文件里面有几个清单选项


2、运行时库的选择,右键-》属性-》C\C++》选项》运行库

     我们看到有/MT,/MTd,/MD, /MDd四个选项,我的项目默认debug是/MDd,release版本下是/MD,带d的是加调试信息的,也就意味着你的运行库都要加d。

    通过上面的e、f描述,应该也有点明白了,为什么我们装了相应的运行库,我们的程序还是报错,

原因是:一般我们安装的运行库Redistributable,都是只带release版本的库的,所以如果你的项目的运行库选项是带d的时候,也会报错,解决办法是安装运行库runtime(同时包含debug和release),当然你在网上搜索runtime也很难找到安装文件。可以到VS的安装目录下去找,但是VS2010需要特殊处理才可安装。

下一篇文章,我会分享VS2008 和 VS2010 的运行库供大家下载。


2 0