2

我安装了 Visual Studio 2015,并构建了一个 .NET 4.6 应用程序,该应用程序依赖于一些第三方 .NET 程序集,这些程序集依赖于一些 C++ DLL 和 EXE,而后者又依赖于 Visual C++ 2012 x64 Redistributable。我使用的 SDK 包括一些合并模块,这些模块部署了我所依赖的 SDK 的 .NET 和 C++ 程序集(但不是 Visual C++ 运行时)。

如果目标计算机上未安装 Visual C++ 2012 可再发行组件,我的 .NET 4.6 应用程序会在启动Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'MyManagedDependency.dll' or one of its dependencies. The specified module could not be found.时崩溃,并说即使我在目标系统上安装了 Visual C++ 2015 可再发行组件也会发生这种情况。因此,C++ 运行时依赖项似乎不向后/向前兼容。

我正在使用 Visual Studio 2015 安装项目为我的应用程序创建安装程序。但是,我可以从中选择的安装程序先决条件列表不包括 Visual C++ 2012 运行时库。我可以选择作为安装项目先决条件的唯一 Visual C++ 库是“Visual C++“14”运行时库”。我相信这些与 Visual C++ 2015 Redistributable 相同,这不足以让我的软件加载。

有没有办法将 Visual C++ 2012 运行时添加到我的 VS2015 安装项目安装程序的先决条件列表中(例如,通过安装更多 SDK)?还是有另一种方法我应该在我的安装程序中打包 2012 C++ 运行时?

编辑:挖掘我正在使用的第三方 SDK 的文档和安装程序包,看起来我的应用程序实际上可能只有在目标系统上同时存在 Visual C++ 2010 和 2012 可再发行组件时才能正确运行。此外,我可能需要同时安装 x86 和 x64 版本。我认为我不能安装所有带有合并模块的模块,因为这个页面说

我们建议您不要使用合并模块,除非您不必为您的应用程序提供服务并且您不依赖多个版本的 DLL。同一 DLL 的不同版本的合并模块不能包含在一个安装程序中,合并模块使得独立于您的应用程序服务 DLL 变得困难。相反,我们建议您安装 Visual C++ Redistributable Package。

如何将这些较旧的可再发行组件添加为我的 VS2015 安装项目的先决条件?

4

1 回答 1

1

经过几个小时的研究,我发现当然可以将项目添加到 Visual Studio 2015 安装项目先决条件对话框。

将此答案此 MSDN 文章中的VS2015更新的引导程序路径 (\Program Files (x86)\Microsoft Visual Studio 14.0\SDK\Bootstrapper\Packages) 相结合将实现该目标。

但是,这将给我留下一个只能在相当高度定制的构建环境中正确构建的设置项目,这将很难在新机器上重现。我发现没有易于安装的 VS 附加组件或 MS 包可以添加此支持。

最后,我现在采用的方法是将以下 MS 合并模块添加到我的设置项目中:

  • Microsoft_VC110_CRT_x86.msm
  • Microsoft_VC110_CRT_x64.msm
  • Microsoft_VC120_CRT_x86.msm
  • Microsoft_VC120_CRT_x64.msm

这导致运行时 DLL 被部署到 C:\Windows\System32 和 C:\Windows\SysWOW64,它们似乎可以工作。这不会导致可再发行组件出现在 Windows“程序和功能”对话框中。

但是,由于 MS 不建议使用这种部署运行时的方法,我愿意使用任何更易于维护的方法来将“真正的”VC++ 2010 和 VC++ 2012 Redistributable 与我的 VS2015 安装项目打包在一起。

于 2016-09-23T12:20:15.203 回答