今天在这里跟大家聊聊关于 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. 一个Java应用,三种字体风格(Java, Windows, Mac),真是蛋疼

    大家看看下面这张图,红色圈起来的是Java难看至极的字体渲染,黄色圈起来的是正常的Windows渲染,绿色是Mac风格的渲染. 其实我感觉正常风格就挺好的,就是看那个Java的Swing菜单,非常不顺 ...

  2. 通用对象池ObjectPool的一种简易设计和实现方案

    对象池,最简单直接的作用当然是通过池来减少创建和销毁对象次数,实现对象的缓存和复用.我们熟知的线程池.数据库连接池.TCP连接池等等都是非常典型的对象池. 一个基本的简易对象池的主要功能实现我认为应该 ...

  3. TaskCompletionSource的使用场景

    TaskCompletionSource生成Task的另一种方法.使用TaskCompletionSource很简单,只需要实例化它即可.TaskCompletionSource有一个Task属性,你 ...

  4. Maven之Hello World入门实例

    1.使用eclipse创建maven工程在eclipse中,选择新建工程的时候,选择other,找到maven 下一步,下一步,直到出现类似如下图片点击finish即可完成maven工程创建. 运行的 ...

  5. js如何实现继承

    js继承有5种实现方式:1.继承第一种方式:对象冒充  function Parent(username){    this.username = username;    this.hello = ...

  6. Java 泛型总结

    1. 泛型类 class Gen<T> { private T t; public T get(){ return t; } public void set(T argt){ t = ar ...

  7. Correct use of System.Web.HttpResponse.Redirect

    from:https://blogs.msdn.microsoft.com/tmarq/2009/06/25/correct-use-of-system-web-httpresponse-redire ...

  8. 【Vegas原创】安装rhel6.2,不能进图形化界面的终极解决方法

    安装的时候,千万不要一路下一步,you should know,linux不是windows那么的傻瓜.   方法一: 在倒数最后一步,选择Desktop,而千万不要下一步,默认选择Basic Ser ...

  9. IE8以下版本iframe出现滚动条和内容空白问题

    在网页中使用iframe引用了第三方的页面 $("#tianqi").html('<iframesrc="http://i.tianqi.com/index.php ...

  10. 超棒的 15 款 Bootstrap UI 编辑器

    自从 2011 年 Mark Otto 和 Jacob Thornton 开发了  Bootstrap,我们第一次接触并熟知了 Bootstrap .这些都归功于  Twitter!从那以后,它就非常 ...