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

今天闲里偷空看了点Connect大会的视频,C# 6.0的新语法、EF7的支持非关系型数据库、Windows商店应用程序支持.net native等等都令我十分感动。但是,更令我感动的是SharedProject开放给所有类型的项目使用了。

在说SharedProject之前,我们先说一说它的前身——可移植类库(Portable Class Library),简称PCL。

可移植类库:

PCL的本质就是一个类库,但是,它是可移植的。什么是可移植的呢?例如,我们有一个项目,要求多个平台都能用的,那么一般来说会设计成这样:

图画得很烂,算了。-_-|||

Model层、数据访问层、业务逻辑层我们一般都建为普通的类库项目,这点很正常。

随着时间过去,公司规模大了,老板/Boss开始发福的时候,闲得蛋疼说:“哎,我看人家那个啥SilverLight的东西做得挺好看的,我们也把我们的项目弄个吧”。作为码农的你只能说干就干呗。于是就打开VS——新建项目——SilverLight 5——添加Model层的引用。妈蛋,啥玩意?

SilverLight没法添加对普通类库的引用!

这时候,可移植类库就派上用场了。新建可移植类库,将我们原来Model层的代码转移至可移植类库下,接着,代码还是我们原来的那些代码,但Model层已经可以被各个平台类型的项目所引用了。

可移植类库尽管真的很通用,但是其限制也是很大,I/O方面的方法几乎全在可移植类库中无法使用,控件这种更是不用想。

通用应用程序导致SharedProject的诞生:

在WP8.0的时期,我们开发应用使用的是SilverLight的那一套技术,而在Windows 8应用商店开发的过程中,我们用的是Windows Runtime的那一套技术。那段时间的微软肯定是被驴给踢了,最早的WPF,然后SilverLight,接着又来个WinRT,控件的使用方式换了一套又一套,以至于写着WP8.0的时候我们找不到WrapPanel(原生不带,需添加组件)、写着WinRT的时候找不到LongListView。。于是乎,程序员们抱怨了,在WP8.1的时候支持了WinRT,并且能一次开发两个平台的应用。这点怎么办呢?PCL限制过大,一个普通类库的话,两个平台又有少量的区别(例如Win平板没有WP的返回键和搜索键),于是SharedProject就应运而生。

如何建立SharedProject:

在VS2013及之前,我们只能够创建通用应用程序的时候,VS自动创建一个并且是唯一的一个给我们使用。

其中的App1.Shared就是SharedProject。

打开App.xaml.cs

我们可以看到App.xaml是被作为了入口点(当然传统的Main还在,这里不探讨,只探讨在项目可见范围)。并且我们可以看见图中的部分代码变灰色了,因为被条件编译了。注意#if WINDOWS_PHONE_APP,说明只有具有这个条件编译符合才会编译这段代码。接下来我们修改左上角的这个地方。

修改为WindowsPhone,发现我们的代码不再会是灰色的了,也就是说,这段代码在编译为Windows商店应用的时候是被忽略的,而只有在编译为WindowsPhone商店应用的时候才有效的。

可见,作用很强大,可移植类库能够继承被引用项目的条件编译指令,但可惜的是,再强大也只能在应用商店程序项目中使用,什么Winform、WPF等等的都只能看着瞪眼。

但是,在VS2015中,这点改变了。

并且,建多个?没问题。

结论:

辛苦各位看官了。

通过上面的过程,相信我们应该可以发现SharedProject的本质,就是在编译的时候将代码添加进被引用的项目中。(不然没法解释SharedProject能被条件编译指令影响)

因此,我们可以得到以下表格来区分SharedProject与PCL的特点。

项目类型 编译方式 条件编译 API限制
SharedProject 与引用SharedProject的项目的代码合成一起编译 受引用SharedProject的项目的影响,自身无法定义条件编译符号 结合条件编译下,与引用SharedProject的项目相同
可移植类库(PCL) 单独编译成dll 不受引用PCL的项目的影响,能定义条件编译符号

可见,SharedProject对比起PCL有极大的优势。由于受引用SharedProject的项目条件编译符合影响,使得SharedProject可以在不失灵活性的同时能用到相应平台的API。相信在VS2015正式发布后,会有很多博友会喜欢上SharedProject这一个新的项目类型的。

时间: 11-17

VS2015中SharedProject与可移植类库(PCL)项目的相关文章

(15)Visual Studio中使用PCL项目加入WCF WebService参考

原文 Visual Studio中使用PCL项目加入WCF WebService参考 Visual Studio中使用PCL项目加入WCF WebService参考 作者:Steven Chang 2015/01 APP在应用时经常会用到WebService服务,在Xamarin中若同时要让iOS与Android叫用WebService时, 除了分别在iOS与Android中叫用WebService外, 还可以使用PCL项目(portable library class,中文叫可携式类别库),

使用 Portable Class Library(可移植类库)开发 Universal Windows App

今天在这里跟大家聊聊关于 Windows Universal 应用夸平台的问题,首先Universal Windows App的定义相信大家已经有所了解了(如果你是一个刚刚接触 Universal APP 的开发这个请先阅读一下我之前的文章 Windows Phone 8.1 开发技术概览 [Universal APP]), 相信大家在这里最苦恼的事情莫过于在不同开发架构下分享代码了,今天我在这里给大家推荐一个解决方案使用可移植类库(Portable Class Library)在不同的Wind

VS2013和VS2015中MVC 区域路由匹配顺序相反

创建测试工程 分别在vs2013和vs2015中创建mvc项目,并创建First.Second.Three三个Area,每个Area下面创建一个HomeController和Index视图.修改RouteConfig.cs中的路由注册方法,添加命名空间 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.M

Visual Studio 中的 .NET Framework 类库

Visual Studio 中的 .NET Framework 类库 .NET Framework 类库由命名空间组成.每个命名空间都包含可在程序中使用的类型:类.结构.枚举.委托和接口. 当您在 Visual Studio 中创建 Visual Basic 或 Visual C# 项目时,已经引用了最常用的基类 DLL(程序集).但是,如果您需要使用尚未引用的 DLL 中的类型,则需向此 DLL 添加引用.有关更多信息,请参见添加和移除引用. 以下主题提供了下列信息: 每个功能区域的最重要命名

NUnit.Framework在VS2015中如何进行单元测试

微软在VS2015中加入了自动化生成测试功能, 在需要测试的源文件的公共方法中右键既可以创建单元测试. 不过需要注意的是,要在公共方法中创建,否则会提示这个错误 如下是自动化单元测试界面,可以发现在VS2015中,开放了对扩展单元测试的支持,如果你有自己安装的扩展单元测试,那么就会在生成自动化测试这里显示 下面来进入主题,如果进行NUnit单元测试 NUnit当前可以在VS2015中安装第2版和第3版,很多人没有测试成功很大一个原因是安装的版本不对应. 先讲解如果给项目添加NUnit单元测试的支

VS2015 中使用freopen_s

在VS2015中直接使用freopen会报错,系统提示使用函数freopen_s作为代替,其使用方法如下: #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; int main(){ FILE *stream1, *stream2; fopen_s(&stream1, "input.tx

Eclipse中建立自己的类库,给不同的工程使用

在多个工程当中,可能使用到相同的jar包,这时,如果我们建立一个自己的类库,该类库中存放着所有工程均需要的jar包,就可以免去重复导入的麻烦.来看一下操作的主要步骤与过程. Eclipse--->preferences(译偏爱,偏好)---->java-->Build path--->userlibiraries-->new 输入自己命名(这里我创建的是myLibrary),点击add jars将jar包导入. 在使用时,在工程右键,BuildPath---add Libra

VS2015中DataGridView的DataGridViewComBoboxCell列值无效及数据绑定错误的解决方法

在VS2015中练习DataGridView的使用, 发现其中的DataGridViewComBoboxCell列存在着绑定数据库列后出现值无效的提示 根据网上的解决办法,添加了DataError后可以解决问题,但是数据库列依然不能正常绑定 研究一番后终于明白出错的原因,并找到解决方法: DataGridViewComBoboxCell列绑定的数据要存在列的Item内,不然就会认为是错误值,所以在设置列的DataPropertyName值之前一定要填充列的Item,或者提前设置列的绑定数据,最后

抓取scrapy中文文档 第一个Scrapy项目实现

使用Scrapy这个python的网络爬虫框架抓取Scrapy中文文档 开发第一步:新建项目scrapy startproject myfirst 目录结构: myfirst │ scrapy.cfg Scrapy项目配置文件 │ └─myfirst Scrapy项目代码存放目录 │ items.py 存储从抓取的网页中需要保存的数据,再其中指定要存储的域 │ pipelines.py 管道文件,用于存储从抓取的网页中解析出的其他页面的url,相当于任务队列 │ settings.py 爬虫配置