VS2015中SharedProject与可移植类库(PCL)项目
转自:http://www.tuicool.com/articles/beaMZv3
今天闲里偷空看了点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这一个新的项目类型的。
VS2015中SharedProject与可移植类库(PCL)项目的更多相关文章
- .Net 跨平台可移植类库PCL可用于任何平台包括Mono
Microsoft 在 .NET Framework 4 中添加了一个名为可移植类库 (PCL) 的新功能. 利用 PCL,您可以有选择性地面向 .NET Framework.Silverlight ...
- Android的项目不能直接引用可移植类库的项目解决方法
深圳_exception() 10:25:51 Android的项目不能直接引用可移植类库的项目,但是可以引用可移植类库生成的dll,这就意味着无法直接断电调试可移植类库上海-黄药师() 10:26: ...
- [Xamarin.iOS] Visual Studio中Xamarin.iOS项目,无法加入PCL项目参考、NuGet组件参考
[Xamarin.iOS] Visual Studio中Xamarin.iOS项目,无法加入PCL项目参考.NuGet组件参考 解决方案 目前Visual Studio中最新版本的Xamarin.iO ...
- (15)Visual Studio中使用PCL项目加入WCF WebService参考
原文 Visual Studio中使用PCL项目加入WCF WebService参考 Visual Studio中使用PCL项目加入WCF WebService参考 作者:Steven Chang 2 ...
- VS2015中运行ASPX老项目出错HTTP Error 500.23 - Internal Server Error错误
今天翻出以前用VS2010做的老项目,在VS2015中运行ASPX页面浏览,出现错误: HTTP Error 500.23 - Internal Server Error 检测到在集成的托管管道模式下 ...
- Mono 3.0.12 支持可移植类库
Mono 3.0.12已于6月19日发布.对跨平台开发者而言,对可移植类库的支持可能是该版本最重要的变化.该技术可以使一个DLL支持.NET.Windows Store.Windows Phone.S ...
- 使用 Portable Class Library(可移植类库)开发 Universal Windows App
今天在这里跟大家聊聊关于 Windows Universal 应用夸平台的问题,首先Universal Windows App的定义相信大家已经有所了解了(如果你是一个刚刚接触 Universal A ...
- .Net 跨平台可移植类库正在进行
[原文发表地址] Cross-Platform Portable Class Libraries with .NET are Happening [译文发表地址] .Net 跨平台可移植类库正在进行 ...
- VS2015搭建GoogleTest框架--配置第一个项目
最近公司要我学习Google的测试框架google test:https://github.com/google/googletest. GoogleTest是C++的测试框架,我一个学习Java的, ...
随机推荐
- jvm内存溢出分析
概述 jvm中除了程序计数器,其他的区域都有可能会发生内存溢出 内存溢出是什么? 当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出 内存溢出和 ...
- wamp 服务器安装问题 及cmd常用命令 和 php mysql数据库常用cmd命令集
1 官网下载wamp软件包,根据提示安装 2 目录结构: wamp: bin/为套件目录 包括mysql apache php log 日志记录 alias 配置 apps 数据库 ...
- arcgis engine 中出现的内存堆栈溢出问题。
两种解决方案: 1.循环加载mxd文档的时候出现的堆栈溢出,解决办法是每次循环结束时清空FeatureLayer,感觉并不好,但是确实可以实现功能. 2.循环调取featureclass的search ...
- JavaScript 常用代码
未知对象 对象类型名称:xobject.constructor.name 对象成员键名:Object.keys(xobject) 枚举对象成员及其值:for(var propertyName in r ...
- UI-初识君面之理论篇
一个好的app不光要用好的功能,还要有好的界面,这样内外兼修才算得上是一个好的App.其实跟人一样,不能只刷帅,要有内涵(看清楚哦,内涵不是指闷骚).不知不觉在园子里已经晃了八年,来深也八年了,.NE ...
- 转:IE兼容模式下 SCRIPT1028: 缺少标识符、字符串或数字
IE兼容模式下 SCRIPT1028: 缺少标识符.字符串或数字例如下面一段代码 var a = { x: 1, y: 2,};alert(a.x);如果在IE的兼容性视图(IE7文档模式 ...
- [Erlang 0111] Erlang Abstract Format , Part 2
上回书,我们说到飞天玉虎蒋伯芳来到蜈蚣岭,不是,重来,上回咱们说到可以在Erlang Shell里面手工构造,加载并调用一个模块.在那个demo里面,我把多个Form单独生成出来,最后放在一起做 ...
- 版本控制-svn服务器搭建和常用命令(centos 6.3)
Svn是比较优秀的版本控制工具,虽然功能和性能上无法和Git媲美,但由于其容易搭建和使用的特性,所以在各个小公司还是很受欢迎的.使用Git可参考<版本控制-Git服务器搭建和常用命令使用> ...
- POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理
Halloween treats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7644 Accepted: 2798 ...
- 嵌入式Linux驱动学习之路(二十六)DM9000C网卡驱动程序
基于DM9000C的原厂代码修改dm9000c的驱动程序. 首先确认内存的基地址 iobase. 确定中断号码. 打开模块的初始化函数定义. 配置内存控制器的相应时序(结合DM9000C.C的手册). ...