0

我有一个 C++ 本机库,我正在使用 Visual Studio 2005 构建它,它是一个更大项目的一部分。

该项目通常包含其他几个 dll,包括 Microft C++ Redistributable Package 库(例如 msvcr80.dll)。这样我们就可以部署我们的项目,而无需让用户安装 Microsoft Visual C++ Redistributable Package 2005。

问题是,每当我将我的库放入这个更大的项目中时,我都会收到以下错误:

This application has failed to start because the application configuration is incorrect. Reinstalling application may fix this problem.

为了解决这个问题,我查看了我的 dll 使用的是哪个版本的 Visual Studio CRT,以及较大的项目使用的是哪个版本,结果发现它们是不同的。

以下是较大项目的清单:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <noInheritable></noInheritable>
    <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.4053" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</assembly>

这是我从图书馆得到的:

<dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.6195" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
</dependency>

然后我在网上做了一些研究,发现至少有两种方法可以手动更改我的 dll 的 CRT 版本。

第一个是在我的项目中设置以下宏:

#define _CRT_ASSEMBLY_VERSION "8.0.50727.4053"

第二个在这篇文章中有详细说明。

我已经尝试了这两种方法,但都没有奏效。

至于第一个,我已将 _CRT_ASSEMBLY_VERSION 添加到我项目的一个头文件中,但它并没有更改其 CRT 版本。另外,如果我有多个项目,是否必须将这个宏添加到所有项目中?

至于第二个,我将图书馆的清单更改为:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50727.4053' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
        </dependentAssembly>
    </dependency>
</assembly>

但是现在我的库正在生成,里面没有标签。

最后请注意,如果我可以使用第一种方法,我非常喜欢,因为它更简单并且可以直接进入代码,这样我就不必记住为我的项目维护一个单独的清单文件。

4

1 回答 1

0

然而,这是一个高度受控的环境

问题出在哪里,那台机器没有收到 CRT 的最新安全更新。如果那台机器也是安装程序的发起者,那么您肯定会遇到您描述的问题,您要求的 DLL 版本在该机器上不可用。

将文件部署到已知安全问题的用户机器上绝对是一种需要审查的策略。定义 _CRT_ASSEMBLY_VERSION 宏是正确的方法,但请考虑在项目设置中而不是在源文件中设置该宏,这样您就可以绝对确定它是在 vc/include/crtassem.h 获取 #included 之前设置的。项目 + 属性、C/C++、预处理器、预处理器定义设置。

是的,当然在你所有的项目上。

于 2012-06-18T18:36:21.040 回答