Microsoft vcredist在运行时使用的版本比清单中指定的版本高
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Microsoft vcredist在运行时使用的版本比清单中指定的版本高相关的知识,希望对你有一定的参考价值。
Microsoft C ++可再发行组件包如何工作?
我有一个在visual studio 2008中构建的二进制文件。它使用RunTime库作为“多线程DLL(/ MD)”。清单中的版本是Microsoft.VC90.CRT" version="9.0.21022.8"
。我选择了将清单嵌入二进制文件的选项。
当在目标机器中部署此二进制文件时,它会给出运行时错误,说明这一点
无法在动态链接库MSVCP90.dll中找到过程入口点
据我所知,该机器默认包含的msvcp90.dll版本没有我的二进制文件所指的功能。
现在我安装了vc ++ redistributable(vcredist_x86_9.0.30729.17)并再次运行二进制文件。
这次它工作正常,我看到加载的msvcp90.dll
版本9.0.30729而不是9.0.21022.8。
这是怎么发生的?即使嵌入式清单的版本为9.0.21022.8,我的exe如何选择最新版本的msvcp90.dll?
我相信这些差异特定于VS 2008 RTM与SP1。
清单将指定代码的意图,必要的权限等。但是,即使清单不存在,系统也会检测依赖关系。您的程序取决于VC90 ver 9.0.21022.8或更高版本。这是唯一的问题。然而,app.config可以协助绑定的特定版本,类似于以下内容:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
<windows>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/>
<bindingRedirect oldVersion="9.0.30729.1" newVersion="9.0.21022.8"/>
</dependentAssembly>
</assemblyBinding>
</windows>
</configuration>
在app.manifest中,您可以设置_BIND_TO_CURRENT_VCLIBS_VERSION来控制它。
.h和.lib文件确定依赖项。
- >编辑:
关于你对名称错误的入口点_Xbad @ tr1 @std @@ YAXW4error_type @ regex_constants @ 12 @@ Z的评论:
(未修饰的是void std :: tr1 :: _ Xbad(enum std :: tr1 :: regex_constants :: error_type))
它实际上是在后来的SP1 MSVCP90.DLL(9.0.30729.17)中找到的序数:1513(0x05E9)
但它不在旧的RTM版本(9.0.21022.8)中(使用依赖性walker查看入口点)
您必须使用最新的.h和.lib编译代码,以便链接器解析该函数,因此很奇怪为什么您的依赖版本不会更新,因为您的代码需要旧版本中不存在的函数。我会确保您的依赖项针对较新的版本。我希望这有帮助。
以上是关于Microsoft vcredist在运行时使用的版本比清单中指定的版本高的主要内容,如果未能解决你的问题,请参考以下文章
解决 php-cgi 启动时提示缺少 msvcr110.dll 的问题
inno setup怎么检测系统是不是安装了vcredist
c#开发的winform程序,发布的x64的程序在x64电脑安装时出现未能找到vcredist_x64.exe错误