今天在这里跟你们聊聊关于 Windows Universal 应用夸平台的问题,首先Universal Windows App的定义相信你们已经有所了解了(若是你是一个刚刚接触 Universal APP 的开发这个请先阅读一下我以前的文章 Windows Phone 8.1 开发技术概览 [Universal APP]), 相信你们在这里最苦恼的事情莫过于在不一样开发架构下分享代码了,今天我在这里给你们推荐一个解决方案使用可移植类库(Portable Class Library)在不一样的Windows项目之间分享代码。(Windows 8.1 / Windows Phone 8.1 )这里还包括Silverlight开发的 Windows Phone 8.1 应用。html
首先介绍一下什么是 Portable Class Library,称之为‘可移植类库’(简称PCL)支持 C# 语言开发,而且在开发 Universal 类库时支持UI呈现。 这里在次强调一下目前只支持C#开发,C# 的语法能够在 PCL 中使用,方便C# 的开发人员快速上手,而且支持调用 Windows Runtime 的 SDK 例如,网络访问,JSON 处理,内容分享等功能。 也很是适合三方SDK开发和功能集成。网络
如何建立一个 PCL 的类库呢很是简单只须要打开咱们的VS2013(update 2 及以上版本)选择Universal 应用模板 选择PCL的项目模板便可,(Component支持 Universal 应用。 DLL 支持Silverlight以及 Windows XAML C# 应用)这里最大的区别是 DLL 的类库不容许类库中使用UI内容。(缘由很是简单 Universal 应用和 SL的应用架构不一样)架构
经过项目属性 咱们还能够经过 Output Type 来切换项目的输出类型(Component 或 DLL)测试
另外 咱们还能够是经过 Targets 属性来适配应用的应用适配平台,这里要注意的是若是应用跨 Universal 和 Silverlight 平台 (8.0 和 8.1)类库内容会受到很大的影响(类库版本越旧咱们在PCL中可使用的WinRT feature 也就越少),而且PCL 将不能支持UI控件的分享。ui
上面提到各类限制肯能有些复杂,我用一张图来给你们说明一下。(这里针对Universal 8.1 APP 和 Silverlight 应用架构)this
1.若是你的类库只想被Universal 应用调用,那么你须要选择 Windows Runtime Component 进行输出,你的PCL将支持大部分 Windows RT的 Feature 而且支持UI控件的分享,可是WinJS项目不支持 UI 控件的展现,这里缘由很简单 XAML上层渲染和 HTML是不一样的。spa
2.若是你须要你的PCL支持 Silverlight 项目的调用,那么你须要选择 Class Library (DLL)进行输出,你的PCL也能够支持大部分 Windows RT的 Feature 。可是不能够进行 UI控件的分享,而且你输出的DLL将不能被 Universal APP的 C++ XAML 和 HTML WinJS 项目调用。3d
这里最好的建议就是相同的类库,若是想让它同时兼容 Universal 架构(XAML C++/C# 和 HTML WinJS)Silverlight架构,只须要将PCL的输出类型切换在编译一次就可。(三方SDK建议这样作:))code
我这里给你们一个测试代码是使用 WinRT中的Share Contract 进行应用间分享。(由于没有 UI 内容能够直接 Target 到 Universal 和 Silverlight 项目中去,固然是两次编译)component
项目结构(为了方便这里我作了 Component 和 DLL 的项目可是项目中的代码是相同的,固然在开发的时候用link的形势也能够)
PCL 分享类库代码以下
public sealed class ShareText { private DataTransferManager dataTransferManager; public string DataContent { get; set; } public ShareText() { this.dataTransferManager = DataTransferManager.GetForCurrentView(); this.dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager, DataRequestedEventArgs>(this.OnDataRequested); DataContent = "Share Text From PCL"; } private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs e) { // Call the scenario specific function to populate the datapackage with the data to be shared. if (GetShareContent(e.Request)) { // Out of the datapackage properties, the title is required. If the scenario completed successfully, we need // to make sure the title is valid since the sample scenario gets the title from the user. if (String.IsNullOrEmpty(e.Request.Data.Properties.Title)) { return; } } } public bool GetShareContent(DataRequest request) { bool succeeded = false; string dataPackageText = DataContent; if (!String.IsNullOrEmpty(dataPackageText)) { DataPackage requestData = request.Data; requestData.Properties.Title = "Share Text"; requestData.Properties.Description = "Share Description"; // The description is optional. //requestData.Properties.ContentSourceApplicationLink = GetType().Name; requestData.SetText(dataPackageText); succeeded = true; } else { request.FailWithDisplayText("Enter the text you would like to share and try again."); } return succeeded; } public void ShowShareUI() { // If the user clicks the share button, invoke the share flow programatically. DataTransferManager.ShowShareUI(); } }
C# 项目调用
private void Button_Click(object sender, RoutedEventArgs e) { UniversalComponent.ShareText st = new UniversalComponent.ShareText(); st.DataContent = "Hello PCL form C#"; st.ShowShareUI(); }
C++ 项目调用
void UniversalC__App::BlankPage::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) { UniversalPCL::ShareText^ ST = ref new UniversalPCL::ShareText; ST->DataContent = "Hello PCL from C++"; ST->ShowShareUI(); }
HTML + WinJS项目调用
function callComponent() {
var component = new UniversalPCL.ShareText(); component.dataContent = "Hello form JS"; component.showShareUI(); }
Silverlight C# 调用
private void Button_Click(object sender, RoutedEventArgs e) { UniversalComponent.ShareText st = new UniversalComponent.ShareText(); st.DataContent = "Hello PCL form SL"; st.ShowShareUI(); }
咱们能够在 VS 中测试任意一个平台的调用状况
这里我就不逐一展现测试效果了,贴一张 C++ 调用的截图让你们过过瘾也好 :)
但愿上的总结能够帮助到你们, 同时欢迎你们在这里和我沟通交流或者在新浪微博上 @王博_Nick