[转]找不到从属程序集 Microsoft.VC90.DebugCRT

VC编写的程序不能在其他机器上运行的解决方案

转载地址:http://www.cnblogs.com/killmyday/articles/1394596.html

有的时候,你在Visual C++上面经过好几个月的辛勤努力,终于将程序编写完成并且测试完毕,然而当你试图在客户的发布机上运行刚写好的程序时,有可能会碰到类似下面的错误,操作系统告诉你“由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题”:

一般情况下,这个问题都是由于程序不能找到所需要的C运行库(CRT)而引起的。

在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文件的内容如下(test.exe.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包安装上就可以了。

时间: 2024-08-20 10:39:53

[转]找不到从属程序集 Microsoft.VC90.DebugCRT的相关文章

winserver2008,运行可执行文件,提示 激活上下文生成失败。 找不到从属程序集 Microsoft.VC90.DebugCRT,processorArchitecture=&quot;x86&quot;

首先我运行的可执行文件是在win7下使用vs2008生成的release版本的文件,为什么在运行的时候提示需要DebugCRT? 另外我在winserver2008上是安装了vc2008的运行环境的.  是因为使用的两个静态库是debug版本的!!

找不到从属程序集 Microsoft.VC90.CRT,processorArchitecture=&quot;x86&quot;,publicKeyToken=&quot;1fc8b3b9a1e18e3b&quot;,type=&quot;win32&quot;,version=&quot;9.0.21022.8&quot;

“C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\webservice\396619ef\64fa1a2a\assembly\dl3\d8aa258e\ea6ee7cd_64f0d001\System.Data.SQLite.dll”的激活上下文生成失败. 找不到从属程序集 Microsoft.VC90.CRT,processorArchitecture="x86",publicKeyToken

关于“找不到附属汇编 Microsoft.VC90.CRT,上一个错误是 参照的汇编没有安装在系统上。”的解决

关于“找不到附属汇编 Microsoft.VC90.CRT,上一个错误是 参照的汇编没有安装在系统上.”的解决 一个项目需要在Win系统用计划任务执行PHP,写了个批处理bat利用php-cgi.exe进行执行PHP文件,由于在服务器运行为了不影响服务器既有的PHP配置信息,同时也是考虑未来的移植性还有性能问题,自己弄了个精简了的PHP运行环境. 可在Win下死活也是执行不了,运行批处理直接闪一下就啥都木有咧,于是为了看具体的状态,使用cmd命令行模式去运行批处理文件,结果提示“系统无法执行指定

未能加载文件或程序集“Microsoft.mshtml, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项。系统找不到指定的文件。

问题: 经过一系列折腾,这里提出一个解决方案,不一定适用于所有系统,仅供参考(具体原理没研究) 运行软件时提示:未能加载文件或程序集“Microsoft.mshtml, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项.系统找不到指定的文件. 解决: 1.这里安装一个Microsoft Office 就解决了,注意安装Office 工具(原理没研究,估计应该是环境没配置好),这里只是一个解

未能加载文件或程序集 Microsoft.ReportViewer.Common, Version=11.0.0.0

WinForm客户端软件开发时,使用rdlc做报表,并且使用ReportViewer呈现报表时,开发者的机器运行正常.但是部署到第三方机器上运行时报错.大致有以下几种错误: (1)未能加载文件或程序集"Microsoft.ReportViewer.Common, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"或它的某一个依赖项.系统找不到指定的文件.文件名:"Microsoft.Repor

未能加载文件或程序集Microsoft.ReportViewer.WebForms, Version=10.0.0.0

解决方案如下ASP.NET项目使用VS2010开发,部署到windows 2008环境中,出现未能加载文件或程序集“Microsoft.ReportViewer.WebForms, Version=10.0.0.0的问题,在网上找了一些答案都解决不了,最终在微软网站下载Microsoft Report Viewer 2010 Redistributable Package安装就可以了.Microsoft Report Viewer 2010 Redistributable Package 包含用

执行enable-migrations时,报“使用“2”个参数调用“SetData”时发生异常:“程序集“Microsoft.VisualStudio.TeamArchitect.ModelingProject,..”

今天打开MVC项目(Code-First),打算手动更新数据库,所以直接在"程序包管理控制台"中执行如下命: enable-migrations -contexttypename BJYLOnlineServ.Areas.Enterprise.DAL.EnterpriseContext  -MigrationsDirectory Migrations\Enterprise: 控制台直接给了我一个这样的错误,我奇怪了,之前还好好的啊,怎么回事了.错误: PM> enable-mig

报错:未能加载文件或程序集Microsoft.office.interop.excel,Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c”HRESULT:0x80131040

报错:未能加载文件或程序集Microsoft.office.interop.excel,Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c” 或它的某一个依赖项.找到的程序清单定义与程序集引用不匹配.异常来自HRESULT:0x80131040 WIN7环境.在装有2003的excel的XP导出成功 一直用office2010dll调试,不能导出excel 2003等旧版的. 把microsoft.office.C

未能加载文件或程序集“Microsoft.ReportViewer.WebForms, Version=10.0.0.0

未能加载文件或程序集“Microsoft.ReportViewer.WebForms, Version=10.0.0.0 最后下载了Microsoft Report Viewer 2010 Redistributable Package 安装就行了 下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=6442 未能加载文件或程序集"Microsoft.ReportViewer.WebForms, Version=10.0.0.