13

我们正在将一个 VC++ 项目从 Visual Studio 2003 移植到 Visual Studio 2008 SP1(9.0.30729.4148)。依赖的外部库也使用 Visual Studio 2008 SP1 编译。

MainApp - Main application Compiled with VS SP1 9.0.30729.4148
ExtStaticLib1 - External static library compiled with VS  SP1 9.0.30729.4148
ExtDynamicDll1 - External DLL compiled with VS  SP1 9.0.30729.4148

Main 应用程序有两种部署方案:

  • 具有用户管理员权限的机器:我们建议在使用应用程序 MainApp 之前先安装 Visual Studio 可再发行包。这很好用,因为用户具有管理员权限并且安装可再发行包没有问题。应用程序自动链接到 WinSxS 文件夹中的 VC redist DLL。
  • 具有非管理员用户的机器:这种情况是有问题的。用户没有管理员权限。因此,无法安装 VS2008SP1 可再发行包。

我们正在做以下事情来解决这个问题:

  • 使用宏 _BIND_TO_CURRENT_OPENMP_VERSION 编译 MainApp 目标(适用于 MainApp 中的所有项目)。

  • 将 VS2008SP1 可再发行 DLL 作为私有程序集分发,并将它们复制到应用程序安装目录中。

问题:

  1. 使用标志 _BIND_TO_CURRENT_VCLIBS_VERSION 是否有任何副作用(特别是当 VC 可再发行包和私有 VC 可再发行程序集同时存在时)?
  2. 我们对外部库 ExtStaticLib1、ExtDynamicDll1 没有太多控制权,因此它们不会使用宏 _BIND_TO_CURRENT_OPENMP_VERSION 进行编译。但是它们已经用 VSSp1 编译过了。这个设置会有问题吗?
  3. 如果有更新版本的 VS 可再发行版本可用(比 9.0.30729.4248 更新),是否会有任何问题。

谢谢。

4

2 回答 2

2

我会避免使用任何 BIND 宏。你迟早会遇到麻烦。

即使您将 VC 运行时 dll 作为私有程序集分发,您也不能确定用户没有使用其他应用程序安装它们。

出现的一个问题是您最终可能会得到一个引用多个 c 运行时版本的清单。是一个关于此的未解决问题(仅供参考:我遇到了同样的问题!)。

因此,如果没有理由迫使您只使用一个非常特定版本的 c-runtime 而不是最新的兼容版本,那么就不要使用那些定义宏!

于 2011-07-28T18:34:04.640 回答
1

发现这个博客资源可以回答你的问题。请参阅“更新、补丁和服务包”部分 http://helgeklein.com/blog/2010/03/deploying-visual-c-runtime-files-as-private-assemblies/

于 2011-07-28T17:26:59.330 回答