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

如果不调用系统接口,VC也可以不需要vcredist

c#开发的winform程序,发布的x64的程序在x64电脑安装时出现未能找到vcredist_x64.exe错误

vcredist_x64.exe/vcredist_x86.exe的用处

各个版本Microsoft Visual C++官方下载链接