使用 Portable Class Library(可移植类库)开发 Universal Windows App
今天在这里跟大家聊聊关于 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的更多相关文章
- 用.NET开发通用Windows App
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:随着Windows 10的正式发布,作为.NET开发人员应该开始或多或少了解一下通用( ...
- 怎样使用 App Studio 高速定制你自己的 Universal Windows App
今天之所以在写一篇关于 App Studio 的文章是由于,App Studio 经过了几次升级功能得到了明显提升还能够调用系统功能了.而且能够更方便的和应用商店关联公布 Universal Wind ...
- 如何使用 App Studio 快速定制你自己的 Universal Windows App
之前我为大家介绍过 App Studio 这只神器可以帮助大家快速制作一个 Windows Phone 8 的应用,今天之所以在写一篇关于 App Studio 的文章是因为,App Studio 经 ...
- Developing Universal Windows Apps 开发UWA应用 问答
开始是一些欢迎,就不翻译 Question: Is the code already there? Answer: There is some code on that codeplex site, ...
- 使用 .NET 平台,如何玩转 Universal Windows 应用?
2015年7月30日 本文作者是 Managed Languages 团队项目经理 Lucian Wischik. 不久前,Visual Studio 2015上新增 Windows 10 应用的开发 ...
- MVA Universal Windows Apps系列学习笔记1
昨天晚上看了微软的Build 2015大会第一天第一场演讲,时间还挺长,足足3个小时,不过也挺震撼的.里面提到了windows 10.Microsoft edge浏览器.Azure云平台.Office ...
- VS2015中SharedProject与可移植类库(PCL)项目
转自:http://www.tuicool.com/articles/beaMZv3 今天闲里偷空看了点Connect大会的视频,C# 6.0的新语法.EF7的支持非关系型数据库.Windows商店应 ...
- .Net 跨平台可移植类库PCL可用于任何平台包括Mono
Microsoft 在 .NET Framework 4 中添加了一个名为可移植类库 (PCL) 的新功能. 利用 PCL,您可以有选择性地面向 .NET Framework.Silverlight ...
- .Net 跨平台可移植类库正在进行
[原文发表地址] Cross-Platform Portable Class Libraries with .NET are Happening [译文发表地址] .Net 跨平台可移植类库正在进行 ...
随机推荐
- 升级ruby版本那"不堪回首的经历"
前段时间在玩Chef-一个IT基础设施自动化工具.由于Chef是由Ruby写的一个gem,那么就需要安装Ruby.当然Ruby我早就安装了,并且使用rvm来管理Ruby及Gem.本来一切看似正常,但是 ...
- 使用jQuery和CSS3生成的搜索框变形全屏搜索效果
在线演示 本地下载 使用jQuery和CSS3过渡变形效果生成的一个搜索框变形效果实现,可以帮助你更好利用页面格式和内容.实验性质的代码,请大家在产品环境里自己修改使用!
- atitit. access token是什么??微信平台公众号开发access_token and Web session保持状态机制
atitit. access token是什么??微信平台公众号开发access_token and Web session保持状态机制 1. token机制and session保持状态机制 1 ...
- 结构体快排回顾(sort)
一般来说,我做竞赛的时候排序一般用快排 很快很方便 普通sort(从小到大) sort(a,a+n); 直接贴一段代码吧,包含了vector,sort,结构体等简单东西综合 #include < ...
- AndroidStudio的一些坑
以下环境为Android Studio 1.3.2,Gradle 2.7(as自带2.4,另下载的2.7) 编译时提示Multiple dex files define: Lcom/sina/weib ...
- 在C#中如何读取枚举值的描述属性
在C#中,有时候我们需要读取枚举值的描述属性,也就是说这个枚举值代表了什么意思.比如本文中枚举值 Chinese ,我们希望知道它代表意思的说明(即“中文”). 有下面的枚举: 1 2 3 4 5 6 ...
- [1].jekyll扫盲
一.jekyll是什么? jekyll是一款免费的blog生成工具,将纯文本(plain text)转换为静态网站或博客. Jekyll是一个使用Ruby编写的静态站点生成工具,使用Liquid模板渲 ...
- Visual Studio 2013 and .NET 4.6
I'm trying to set the 4.6 .NET framework for my project and in the settings, as it wasn't listed, I ...
- Lucene 4.X 倒排索引原理与实现: (1) 词典的设计
词典的格式设计 词典中所保存的信息主要是三部分: Term字符串 Term的统计信息,比如文档频率(Document Frequency) 倒排表的位置信息 其中Term字符串如何保存是一个很大的问题 ...
- Android音频介绍
这个世界音频设备千变万化,Android也不可能为每种设备都提供支持.Android定义了一个框架,这个框架来适配底层的音频设备.该适配层的定义位于: hardware/libhardware_leg ...