如果您已经使用VisualC++生成了软件,您可能不得不考虑部署C++运行时DLL。 如果二进制文件动态链接到C++库,那么桌面应用程序可能部署C++运行时。 VCRedist公司 , 合并模块 或者通过复制C++运行时DLL和自己的二进制文件。 在这个博客文章中,我们将研究如何完全使用C++编写的Windows 8商店应用程序或包含使用C++编写的一些组件。
Windows8重新设计了应用商店应用的部署模式。 作为一名开发人员,您不会编写安装或卸载Windows应用商店应用程序的例程。相反,您可以打包应用程序并将其提交到Windows应用商店。用户以应用程序包的形式从Windows应用商店获取您的应用程序。Windows使用应用程序包中的信息以每个用户为单位安装应用程序,并确保所有安装该应用程序的用户卸载该应用程序后,该应用程序的所有痕迹都从设备中消失。 关于这种新型号有更多的细节 在这里 .
拥有一个统一的部署模型简化了应用程序开发人员的生活,并且以应用商店的形式拥有一个单一的可信应用程序源,为最终用户提供了更大的信心。 这反过来又有助于生态系统。
通常,应用程序包是一个完全包含的、自给自足的部署单元,包含应用程序的所有二进制文件、资源、资产等。 但有时需要在一些外部组件(如C++运行时DLL)上表达依赖性。 为了提供这个功能,我们创建了一个特殊的包,称为C++运行时包。 这个包的特殊之处在于它是一个Windows组件库,其他包可以依赖它,并且可以由多个包共享。 这个包包含了与Windows商店应用程序相关的所有C++运行时DLL。 如果应用程序包指定了C++运行时包的依赖关系,那么在运行时,应用程序就能够加载C++运行时DLL。 从依赖项包 .
如果使用VisualStudio 2012创建C++应用程序包,那么VS会自动向应用程序的AppXMealth.xml中引入一个引用,它基本上表达了对C++运行时包的依赖性。
C++运行时包已经在商店上。 因此,当您将C++应用程序(带有C++运行时依赖)上传到商店时,该商店足够聪明,可以将应用程序与最新的C++运行时包版本关联起来。 现在,当终端用户从商店下载应用程序时,他们也会得到C++运行时包和应用程序。 仅当最终用户计算机上尚未存在依赖项包,或者最终用户计算机上的版本号小于存储区中最新的依赖项包时,才下载该依赖项包。
为了表达C++应用程序的C++运行时依赖性,并模仿开发人员的机器上的运行时行为,正如在终端用户的机器上看到的那样,我们利用了新的 Visual Studio扩展SDK 机制。
如果你在文件夹下查看“ 程序文件(x86)Microsoft SDK Windows V8.0扩展SDK “在您的计算机上,您将看到一个SDK列表,您的Windows应用商店应用程序可以使用Visual Studio的“添加引用”功能利用这些SDK。 例如,如果我在VS中创建C++ Windows 8存储项目,并调用“添加引用”对话框,这里是我的机器上的样子:
您会注意到,虽然上面提到的文件夹包含一个名为“微软.Vclib”的条目(基本上是C++运行时的扩展SDK),但它没有在“添加引用”对话框中列出。 这是因为当您构建C++项目时,VS会自动将项目中的引用插入到MySoF.Vclipse SDK中。
那么,添加这个SDK引用的结果到底是什么呢?
有几件事:
1) 构建应用程序时 AppxManifest.xml文件 文件(它描述了包到Windows的属性)自动获得C++运行时包的依赖项。 如果查看应用程序包的AppxManifest.xml文件,您将看到如下部分:
<相关性>
这基本上意味着现在应用程序包需要在安装之前,必须在机器上安装一个包,名称为MySoF.VCclibs110 00(C++运行时包),至少一个版本为110.50727.1(VisualStudio 2012 RTM版本)。
2) 如果您是从应用商店安装此应用程序,那么如前所述,应用商店也会自动向下推依赖项包。 但是,当您只想在开发人员机器上调试应用程序时,VisualStudio会看到您的项目对MySoF.Vclipse SDK有一个引用,因此它知道在运行时(当您点击F5运行应用程序)时,它需要部署C++运行时包(在“找到”)。 程序文件(x86)Microsoft SDK WindowsV8.0扩展名DKSMicrosoft.VCLibs11.0AppXRetailx86 )以及您的应用程序。 这样,运行时行为类似于最终用户机器上的行为。
如果您检查文件夹的内容“ 程序文件(x86)Microsoft SDK Windows V8.0扩展名DKSMicrosoft.VCLibs11.0AppX ,您将注意到它包含所有体系结构的调试和发布包。 根据项目的配置(调试或发布),VS将依赖项插入到适当的C++运行时包(调试或发布)。 调试包仅用于调试目的(用于F5),不上载到存储。 这意味着在调试提交过程中,任何对调试C++运行时包依赖性的应用程序包都不会被接受。
Windows 8应用商店应用程序的一个优点是,构建混合应用程序非常容易,其中应用程序的不同组件可以用不同的语言编写,并且可以使用Windows运行时技术轻松地进行交互(请参阅) 在这里 例如)。
假设您创建了一个VisualStudio项目,用于使用.NET或JavaScript构建Windows应用商店应用程序。 现在在同一个解决方案中,您可以添加C++组件项目来执行一些计算密集型作业。 当您将主应用程序项目的引用添加到C++组件项目时,VS会自动检测到您的整个应用程序依赖于C++组件(在运行时需要C++运行时DLL)。 因此,它在应用程序内部插入依赖于C++运行时包的依赖项。
有些情况下,您使用.NET或JavaScript编写应用程序,并且希望使用C++编写的组件。 但是,对于C++组件,您没有VisualStudio项目,而只有手动添加到应用程序包的二进制文件和元数据。 但是这些C++组件二进制文件需要C++运行时DLL。 在这种情况下,您可以直接使用“添加引用”对话框从主应用程序项目(.NET或JavaScript)添加引用到C++运行时包,如下所示:
正如您所看到的,在这种情况下,C++运行时包被列为选项,因为它没有被HTML/JavaScript应用程序自动引用。
您可能会注意到,在大多数情况下,作为Windows 8存储应用程序开发人员,很少需要考虑C++运行时。 它主要由visualstudio和商店为您处理。 一如既往,我们很高兴收到您对上述解决方案的任何反馈。 我们总是希望改进库的功能以及部署过程。
谢谢你
拉曼沙玛