1

Microsoft C++ 可再发行包如何工作?

我有一个在 Visual Studio 2008 中构建的二进制文件。它使用运行时库作为“多线程 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?

4

1 回答 1

1

我相信这些差异特定于 VS 2008 RTM 与 SP1。

清单将指定代码的意图、必要的权限等。但是,即使清单不存在,系统也会检测依赖关系。您的程序依赖于 VC90 版本 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) 中发现Ordinal: 1513 (0x05E9)

但是它不位于较旧的 RTM 版本 (9.0.21022.8) 中(使用依赖遍历器查看入口点)

您必须使用最新的 .h 和 .lib 编译您的代码,以便链接器解析该函数​​,所以很奇怪为什么您的依赖版本不会更新,因为您的代码需要旧版本中不存在的函数。我会确保您的依赖项针对较新的版本。我希望这有帮助。

于 2014-04-08T13:27:19.580 回答