今天在这里跟大家聊聊关于 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 应用。

首先介绍一下什么是 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控件的分享。

上面提到各种限制肯能有些复杂,我用一张图来给大家说明一下。(这里针对Universal 8.1 APP 和 Silverlight 应用架构)

1.如果你的类库只想被Universal 应用调用,那么你需要选择 Windows Runtime Component 进行输出,你的PCL将支持大部分 Windows RT的 Feature 并且支持UI控件的分享,但是WinJS项目不支持 UI 控件的展示,这里原因很简单 XAML上层渲染和 HTML是不同的。

2.如果你需要你的PCL支持 Silverlight 项目的调用,那么你需要选择 Class Library (DLL)进行输出,你的PCL也可以支持大部分 Windows RT的 Feature 。但是不可以进行 UI控件的分享,并且你输出的DLL将不能被 Universal APP的 C++ XAML 和 HTML WinJS 项目调用。

这里最好的建议就是相同的类库,如果想让它同时兼容 Universal 架构(XAML C++/C#  和 HTML WinJS)Silverlight架构,只需要将PCL的输出类型切换在编译一次就可。(三方SDK建议这样做:))

我这里给大家一个测试代码是使用 WinRT中的Share Contract 进行应用间分享。(因为没有 UI 内容可以直接 Target 到 Universal 和 Silverlight 项目中去,当然是两次编译)

项目结构(为了方便这里我做了 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

使用 Portable Class Library(可移植类库)开发 Universal Windows App的更多相关文章

  1. 用.NET开发通用Windows App

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:随着Windows 10的正式发布,作为.NET开发人员应该开始或多或少了解一下通用( ...

  2. 怎样使用 App Studio 高速定制你自己的 Universal Windows App

    今天之所以在写一篇关于 App Studio 的文章是由于,App Studio 经过了几次升级功能得到了明显提升还能够调用系统功能了.而且能够更方便的和应用商店关联公布 Universal Wind ...

  3. 如何使用 App Studio 快速定制你自己的 Universal Windows App

    之前我为大家介绍过 App Studio 这只神器可以帮助大家快速制作一个 Windows Phone 8 的应用,今天之所以在写一篇关于 App Studio 的文章是因为,App Studio 经 ...

  4. Developing Universal Windows Apps 开发UWA应用 问答

    开始是一些欢迎,就不翻译 Question: Is the code already there? Answer: There is some code on that codeplex site, ...

  5. 使用 .NET 平台,如何玩转 Universal Windows 应用?

    2015年7月30日 本文作者是 Managed Languages 团队项目经理 Lucian Wischik. 不久前,Visual Studio 2015上新增 Windows 10 应用的开发 ...

  6. MVA Universal Windows Apps系列学习笔记1

    昨天晚上看了微软的Build 2015大会第一天第一场演讲,时间还挺长,足足3个小时,不过也挺震撼的.里面提到了windows 10.Microsoft edge浏览器.Azure云平台.Office ...

  7. VS2015中SharedProject与可移植类库(PCL)项目

    转自:http://www.tuicool.com/articles/beaMZv3 今天闲里偷空看了点Connect大会的视频,C# 6.0的新语法.EF7的支持非关系型数据库.Windows商店应 ...

  8. .Net 跨平台可移植类库PCL可用于任何平台包括Mono

    Microsoft 在 .NET Framework 4 中添加了一个名为可移植类库 (PCL) 的新功能. 利用 PCL,您可以有选择性地面向 .NET Framework.Silverlight ...

  9. .Net 跨平台可移植类库正在进行

    [原文发表地址] Cross-Platform Portable Class Libraries with .NET are Happening [译文发表地址] .Net 跨平台可移植类库正在进行 ...

随机推荐

  1. [stm32] 利用uC-BmpCvt软件生成uc-gui可调用的bmp图片

    >_<:学习贴图[bmp图]:首先找一张bmp格式的图片,然后下载uC-BmpCvt软件,打开改图片 >_<:然后点击Image-Conver-Into-Best Palatt ...

  2. ActiveMQ第五弹:增加ReDelivery功能

    在使用Message Queue的过程中,总会由于种种原因而导致消息失败.一个经典的场景是一个生成者向Queue中发消息,里面包含了一组邮件地址和邮件内容.而消费者从Queue中将消息一条条读出来,向 ...

  3. YUI Compressor for Sublime text2

    YUI Compressor 是一个用来压缩 JS 和 CSS 文件的工具,采用Java开发. 最近压缩文件,常使用在线压缩的方式来压缩文件,一来多有不便,二来如果没有网络,只能搁置了.本文来描述如何 ...

  4. Linux kernel develop -- Hello World

    hello.c: #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h&g ...

  5. iOS App 研发的最后冲刺:内测与部署

    当开发者历经磨难.披荆斩棘,完成了一个iOS项目后,最后的临门一脚就是应用的内测.部署.那么,在这最后的射门动作中,都有哪些地方需要开发者注意?有哪些方式能够更好地帮助我们进行iOS应用的发布部署? ...

  6. IOS设计模式浅析之简单工厂模式(SimpleFactory)

    概述 首先说明一下,简单工厂模式不属于23种GOF设计模式之一.它也称作静态工厂方法模式,是工厂方法模式的特殊实现.这里对简单工厂模式进行介绍,是为本系列后面的工厂方法和抽象工厂模式做一个引子. 定义 ...

  7. JSTL核心标签库使用

    JSTL是什么? java standard taglib(java标准标签库). 标签是什么? sun公司制订的一种技术规范,用来将jsp页面中的java代码使用类似于html当中的标记来替换 的一 ...

  8. Quartz 框架的应用

    本文将简单介绍在没有 Spring 的时候..如何来使用 Quartz... 这里跳过 Quartz 的其他介绍.如果想更加输入的了解 Quartz,大家可以点击下载Quartz的帮助文档. Quar ...

  9. Leetcode 165 Compare Version Numbers

    题意:比较版本号的大小 有点变态,容易犯错 本质是字符串的比较,请注意他的版本号的小数点不知1个,有的会出现01.0.01这样的变态版本号 class Solution { public: int c ...

  10. 如何处理Win7连接vpn时报错789的问题

    [转]VPN错误提示: vpn连接出错789:L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇 (2014-08-11 15:09:10)转载▼标签: it xp连接VPN错误提示: v ...