登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: vs2005编译的程序不能运行的几个解决方法 [zt 有关微软新的 dll 搜索路径知识]     [回主站]     [分站链接]
标题
vs2005编译的程序不能运行的几个解决方法 [zt 有关微软新的 dll 搜索路径知识]
clq
浏览(0) + 2008-08-13 09:43:56 发表 编辑

关键字:

vs2005编译的程序不能运行的几个解决方法 [zt 有关微软新的 dll 搜索路径知识]

http://blog.vckbase.com/localvar/archive/2007/01/31/24367.html
--------------------------------------------------
vs2005编译的程序不能运行的几个解决方法
这两天有点焦头烂额, 我们这边运行的好好的程序, 到了测试的机器上就不能启动(是根本运行不了, 而不是运行出错), 弄得我异常郁闷. 经过了一番摸索, 发现和winxp、win2003中为解决dll hell而引入的manifest机制有关系. 而以前我们用vs2003开发, 它并没有强制程序使用manifest, 但到了vs2005中, 这已经改成必需的了, 而我们并没有按照需要进行相关的配置, 所以程序启动不了了. 根据目前的经验, vs2005编译的程序不能启动大致有两个原因, 下面简单介绍解决办法.
1. 在开发组的机器上(安装有vs2005)有时都不能启动
这一般是项目的文件被放在了fat/fat32分区上导致的, 解决方法是把它们都移动到ntfs分区上, 或者把“项目属性|Manifest Tool|General|Use FAT32 Work-around”设为yes.
2. 开发组运行正常, 换到其它机器上就不行了
这一般就是系统dll(包括crt,mfc,atl等)没有正确配置导致的. 如果程序是release版, 那么很简单, 只要把“\SDK\v2.0\BootStrapper\Packages\vcredist_x86”下的"vcredist_x86.exe"拷贝到目标机器上运行即可, 这是以x86平台为例的, 如果你用的是别的cpu平台(amd64或ia64)把x86替换成相应的内容就可以了.
如果是debug版, 就复杂一些了, 首先要确定你需要的dll的版本, 绝大多数(注意:不是"所有")情况下它和编译器的版本相同, 通过vs2005的关于对话框就能看到, 如下图所示:

确定版本后, 在开发组的机器上进入“%windir%\winsxs"文件夹(下面将以x86平台8.0.50727.762版本的debug crt为例进行说明), 拷贝以下文件到目标机器的相同位置即可:

x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9f文件夹下的所有文件

Manifests文件夹下的x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9f.cat和x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9f.manifest

Policies\x86_policy.8.0.Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_x-ww_09e017b4文件夹下的8.0.50727.762.cat和 8.0.50727.762.policy

注意, 上面的操作只是在目标操作系统为winxp,win2003及以上时才需要的, 如果是win2000及以下的系统, 只要把第一个文件夹下的文件拷贝到system32中就行了.


附:

msdn上有关vc应用程序部署的几片文章, 供参考
Troubleshooting C/C++ Isolated Applications and Side-by-side Assemblies
Deployment Examples


以下是与这个问题相关的一些系统提示信息, 为了让碰到这些问题的人更容易搜到这篇文章, 我把它们列在这里.
参照的汇编没有安装在系统上
应用程序要求的组件版本同另一个活动的组件有冲突。
系统无法执行指定的程序
ERROR_SXS_ASSEMBLY_NOT_FOUND
14003
0x800736B3
The referenced assembly is not installed on your system.

clq
2008-8-13 9:49:24 发表 编辑

据说是微软用了 Manifest 文件来补充说明 dll 不同版本路径的原因.
简单的说就是现在 dll 是允许有多个版本的,至于使用那个版本由某个东东控制,全部的版本文件基本上是在 C:\WINDOWS\WinSxS 目录下.
--------------------------------------------------
.NET对软件安装地冲击
时间:2007-02-12 00:00:00 来源: 作者:

什么是.NET?

.NET是如何改变整个软件安装的?
.NET改变了我们进行软件安装的许多方式。最明显的,我们有了新的语言C#。还有,操作系统也发生了微妙的变化,以及它处理共享代码的方式。

关于元数据(Metadata)
首先,你必须了解什么是Managed Code?所有基于微软中间语言(MSIL)的代码都是以Managed Code运行的。比如.NET推出的新语言C#就完全是以Managed Code运行的。而其他Visual Studio .NET附带的语言,比如Visual C++,允许Managed Code 和None-managed Code 混合使用。
那么Managed Code 有什么特点呢?它与None-Managed Code 的最大区别就是包含了元数据(Metadata)。元数据描述了代码里的每一个元素,允许.NET的运行库对其进行管理,并使得代码可以自描述(Self-Describing)。.NET运行库通过使用元数据来提供诸如内存管理、跨语言集成、代码安全和对象生命周期自动控制等等服务。简单的说,Managed Code就是可以与.NET运行库以“契约合作”的方式运行的代码。
元数据可以包括assemblies、可装载文件、类型、方法等等。与制作安装关系最为密切的就是assembly manifest了。Assembly是一个程序的主要组成部分,包括了所有的功能、版本信息,并作为一个整体进行发布。每一个Assembly都要包括一个assembly manifest,并使得assembly 可以自描述。Manifest包括:

以文本表示的assembly 标识、版本等,如果要与别程序共享,还要包括数字签名。
描述包括的文件
指定assembly的类型和资源,并指明该assembly输出哪些。
列举所有依赖的assembly。
指明运行需要的许可权限
Manifest里也包括了以前是由自注册(Self-Registration)来完成的数据。比如所有的类型信息存放在Manifest里,这些Manifest数据又都放在.DLL或.EXE文件里。这样通过Manifest我们就可以很容易的知道Managed Code 的相互依赖关系,而不会漏掉任何信息。但是,如果是Managed Code 和None-Managed Code的混合情况,就不是那么容易做到了。
如果没有一种新的安装技术出现,开发者将面临一个大难题。

对自安装(Self-Installing)代码的误解
其中一个就是,使用Managed Code编写的软件不需要安装。因为一些安装的任务已经由元数据完成了,比如COM组件的注册。只要把程序的所有文件拷贝到一个目录下面,就可以直接运行了。很遗憾,这并不是软件安装的全部过程。
软件安装并不是简单的把文件从位置A拷贝到位置B。软件安装程序应该是给用户提供一个友好的、可靠的和统一的方式,把软件安装到用户的机器上面。首先,安装程序需要通过一个统一的熟悉的用户界面,让用户选择安装的选项,然后创建文件夹、快捷方式,进行升级、网络安装,还有许可证管理等等。在上面的例子里,你无法为用户完成所有这些事情,更不用说许可证管理了。
另外,Managed Code 和None-managed Code混合的应用程序也不能自安装。而且,要安装这样的程序比安装纯粹的None-managed Code 还要麻烦。我们不可能一下子全部丢掉以前的代码,全部转成Managed Code 。所以,我们不得不认真的考虑这个问题。

Isolated Applications and Side-by-Side Components
在Windows XP和.NET平台里,微软提供了一套机制来减少DLL Hell的发生。我们知道,应用程序一般都依赖于一些共享资源,所谓共享,就是说如果已经有一个资源安装在了系统上,应用程序就不再需要安装该资源了,直接使用就可以了。于是DLL Hell就这样发生了,如果一个应用程序需要一个比系统上现有的共享资源版本更高的资源,于是它以新的高版本的资源代替了老版本。而且有这样的可能,新版本的资源并不能与老版本的资源相兼容。而系统中只能存在该资源的一个版本,所以依赖于老版本资源的应用程序将崩溃!

为了解决这个问题,微软提供了两种方法:Isolated Applications 和Side-by-Side Components。
Isolated Application 就是让应用程序在发布的时候,附带了该程序所有组件的隔离版本(Isolated Version),这样就不会受其他安装程序影响了。但是这需要完全重写代码,代价太高。
Side-by-Side组件就是可以在新旧版本的共享资源一起共存的环境中运行。Windows XP中的许多共享资源就是以Side-by-Side的方式来编写的。开发者可以通过使用编写Application Manifest来达到Side-by-Side 的好处。Application Manifest描述了程序所依赖的组件的版本信息,所以操作系统可以根据这些信息来装载正确的共享资源。比如应用程序是在COMCTL32的V5上进行开发的,并在Application Manifest里指明了依赖于COMCTL32的V5版本。现在,即使系统上存在有别的版本的COMCTL32,操作系统也仍将为该程序装载V5版本的资源。

…..

以上文字摘自InstallShield公司的文档:<>

更多的关于软件安装方面的信息,请访问
http://www.smiling.com.cn/search/groupinfo.ecgi?group_id=24326


总数:1 页次:1/1 首页 尾页  
总数:1 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1