在Centennial project中使用C++运行环境

[原文发表地址]Using Visual C++ Runtime in Centennial project

[原文发表时间] 2016/7/7

前言:

在VS2015的更新中,我们提出了Desktop Bridge(以前叫做Project Centennial),给UWP添加桌面应用程序。利用桌面应用程序转换器,你可以把你的桌面应用程序打包成一个appx包部署到window10 桌面上。参考链接https://developer.microsoft.com/en-us/windows/bridges/desktop可以对Desktop Bridge了解更多. 如果你想转换你的C++ 桌面应用程序(如:win32, MFC等等), 你就必须处理VC++运行配置,例如vcruntime140.dll,像平时对C/C++应用程序所做的操作一样。

我们对 VC++ 11.0版本,12.0版本和14.0版本提供了Visual C++运行环境支持。通过Window存储, 集中部署VC++ runtime DLLs. 这个Runtime是CRT, STL,   ConCRT, MFC, ATL和C++ amp 建立的桌面Visual C++库。从Window下载中心可以下载这些可用的VC++ runtime服务版本:

关于应用程序开发,我们为VC++14.0(VS2015),VC++12.0(VS2013)和VC++(VS2011)的C运行创建了带有桌面库的框架包。此安装程序将把框架包放在扩展SDKs文件夹下: %PROGRAMFILES(X86)%\Microsoft SDKs\Windows Kits\10\ExtensionSDKs

我们新建的框架包将会包含下列所有的Visual C++ Runtime组件:debug x86,debug x64,release x86,release x64.

从转换的桌面应用中引用VC Runtime框架包:

1.首先,确定你已经设置为使用Desktop Bridge (Centennial).参考说明Desktop App Converter Preview (Project Centennial).

2.运行转换器然后安装Win32应用程序。转换器 会捕捉到布局配置,注册表变动和Appx列表输出。

3.在Appx布局中,修改AppxManifest.xml,通过在<Dependencies> 元素下添加<PackageDependency>元素给VCLibs UWPDesktop框架包添加引用:

<PackageDependency Name=”Microsoft.VCLibs.140.00.UWPDesktop” MinVersion=”14.0.24217.0″ Publisher=”CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US” />

然后,从appx配置中移除C++ Runtime dll. 推荐通过框架包来消耗runtime。

注意:用桌面应用转换器v0.1.23,转换器将自动检测VCLibs依赖并将包依赖项添加到AppxManifest.xml文件中。同时也会移除所有本地拷贝的C++runtime dlls.

4.根据你的目标配置和架构安装VCLibs UWPDesktop 框架包。使用加载appxpackage命令行开关。

例如: 如果的应用程序目标是X86 Retail配置,打开powershell:

a.  Goto %PROGRAMFILES(X86)%\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop\14.0\Appx\Retail\x86

b.  Add-appxpackage Microsoft.VCLibs.x86.14.00.Desktop.appx

5.使用add-appxpackage-register AppMainfest.xml 命令行工具配置你的应用程序或者使用MakeAppx重新包装它。

这里可以看到此选项的更多细节。

调试程序:

配置应用程序的调试版本,将一个PackageDependency添加到调试框架包中,Microsoft.VCLibs.140.00.Debug.UWPDesktop:

<PackageDependency Name=”Microsoft.VCLibs.140.00.Debug.UWPDesktop” MinVersion=”14.0.24217.0″ Publisher=”CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US” />

Universal CRT(UCRT)是window10 system32操作系统中的一部分安装(像user32.dll), 但是如果你想调试uCRT版本, 首先你需要安装它。你可以在Window 10 SDK下找到调试版本(和创建应用程序使用的是相同版本)

如果目标机器上没有uCRT调试版本,你就必须在本地打包调试uCRT应用程序。调试的时候,把ucrtbased.dll[1]从C:\Program Files (x86)\Windows Kits\10\bin\<arch>\ucrtbased.dll复制到下一级执行文件中。

VC++ 12.0支持:

VC 12.0(visual studio2013) 的框架包安装在: %PROGRAMFILES(X86)%\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop.120\下

要引用120框架包,在AppxManifest.xml中添加下面内容:

<PackageDependency Name=”Microsoft.VCLibs.120.00.UWPDesktop” MinVersion=”12.0.40653.0″ Publisher=”CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US” />

调试程序:

将包依赖项的名字改为Microsoft.VCLibs.120.00.Debug.UWPDesktop, 然后配置调试版本。

注意,现有的在 Windows 8 的时间范围内创建的VC++12.0库会进行运行时检查来确定这个应用程序是否正在应用程序容器下运行。当运行一个打包的桌面应用程序,这些检查可能会限制桌面应用程序的功能或者导致它像一个UWA(Universal Windows Application)(有限的文件系统访问或者创建线程初始化MTA等等.)我们已经修复了框架包中包含VC++ 库的这种行为,因此桌面应用程序中也会取消最新的应用程序限制。

下一步:

尝试Desktop Bridge,把你的桌面应用程序打包成appx,负载,部署让我们知道在您在使用Visual C++ runtime DLLs时的体验和问题。