使用 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

时间: 2024-10-14 04:00:48

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

用.NET开发通用Windows App

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:随着Windows 10的正式发布,作为.NET开发人员应该开始或多或少了解一下通用(Universal)Windows App的开发了. 所谓Universal Windows App(简称UWP),就是开发一次,可以运行于所有以Windows 10为内核的系统和设备上,包括:桌面设备.移动设备.XBox.HoloLens甚至物联网设备.随着Windows 10在7月29日正式发布,之前没有

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

今天之所以在写一篇关于 App Studio 的文章是因为,App Studio 经过了几次升级功能得到了明显提升还可以调用系统功能了,并且可以更方便的和应用商店关联发布 Universal Windows 应用(注:这是指 Windows 8.1 和 Windows Phone 8.1应用)以及 Windows Phone 8.0应用,接下来我为大家在介绍一下这升级后的 Universal Windows App Studio 使用 App Studio 的意义在于你有一个好的创意,但是由于时

Universal Windows App

Universal Windows App 是一种构建于 Universal Windows Platform (UWP) 之上的 Windows 体验,它首次作为 Windows 运行时在 Windows 8 中引入.Universal Windows App 通常通过 Windows 应用商店进行分发(但也可能会以旁加载形式进行分发),并且通常采用 .APPX 打包格式进行打包和分发. Windows 运行时应用是使用 Windows 运行时且在 Windows 8 或 8.1 设备(如 P

Windows App开发之开发准备

操作系统及SDK 操作系统 显而易见.想要开发Windows App就得在Windows 8/8.1/10上进行.老旧的Windows XP/Vista/7已经不能满足时代的须要了. 当然.在Windows App的发展过程中,其本身也有着较大的变动,为了使用新的特性,建议使用Windows 10.我在写这个教程时.Windows 10正式版并未面世,因此临时未介绍Windows 10上的新特性,随后会继续更新,欢迎您的继续关注. 操作系统除了在官网下载之外.还能够在DreamSpark等地方下

微软的Universal Windows Platform(UWP)

所谓Universal Windows App(简称UWP),就是开发一次,可以运行于所有以Windows 10为内核的系统和设备上,包括:桌面设备.移动设备.XBox.HoloLens甚至物联网设备. 随着Windows 10在7月29日正式发布. 参考:如何入门UWP开发 http://www.zhihu.com/question/34356819 用.NET开发通用Windows App

【万里征程——Windows App开发】开发准备

操作系统及SDK 操作系统 如果打算开发Windows App,那么你的电脑就不能再用老旧的Windows 7了.推荐使用Windows 8.1.写这篇博客的时候,我用的操作系统是Windows 10 Pro Technical Preview [Build 10041]. 操作系统除了在官网下载之外,还可以在DreamSpark等地方下载.DreamSpark上除了Office其他微软操作系统.开发工具及其他软件对学生均免费开放. 另外再推荐一个网站:MSDN i tell you Visua

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

今天闲里偷空看了点Connect大会的视频,C# 6.0的新语法.EF7的支持非关系型数据库.Windows商店应用程序支持.net native等等都令我十分感动.但是,更令我感动的是SharedProject开放给所有类型的项目使用了. 在说SharedProject之前,我们先说一说它的前身——可移植类库(Portable Class Library),简称PCL. 可移植类库: PCL的本质就是一个类库,但是,它是可移植的.什么是可移植的呢?例如,我们有一个项目,要求多个平台都能用的,那

国产达梦数据库的结合Enterprise Library的应用开发

在上篇<基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作>介绍了如何在Enterprise Library的数据访问层上支持这种神秘的国产数据库-达梦数据库.本文继续这一主题,介绍产达梦数据库的结合Enterprise Library的应用开发. 1.达梦数据库还原处理 达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM.达梦数据库管理系统的最新版本是7.0版本,简称DM7.DM7提供对SQL92的特性支持以及

The new Portable Class Library for SQLite z

Microsoft Open Technologies has recently released a Portable Class Library for SQLite. Thanks to it, we can use SQLite in the same way in all the supported platforms. Let's see how to do that. As prerequisite, we need to install the SQLite Extension