转自: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)项目的更多相关文章

  1. .Net 跨平台可移植类库PCL可用于任何平台包括Mono

    Microsoft 在 .NET Framework 4 中添加了一个名为可移植类库 (PCL) 的新功能. 利用 PCL,您可以有选择性地面向 .NET Framework.Silverlight ...

  2. Android的项目不能直接引用可移植类库的项目解决方法

    深圳_exception() 10:25:51 Android的项目不能直接引用可移植类库的项目,但是可以引用可移植类库生成的dll,这就意味着无法直接断电调试可移植类库上海-黄药师() 10:26: ...

  3. [Xamarin.iOS] Visual Studio中Xamarin.iOS项目,无法加入PCL项目参考、NuGet组件参考

    [Xamarin.iOS] Visual Studio中Xamarin.iOS项目,无法加入PCL项目参考.NuGet组件参考 解决方案 目前Visual Studio中最新版本的Xamarin.iO ...

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

    原文 Visual Studio中使用PCL项目加入WCF WebService参考 Visual Studio中使用PCL项目加入WCF WebService参考 作者:Steven Chang 2 ...

  5. VS2015中运行ASPX老项目出错HTTP Error 500.23 - Internal Server Error错误

    今天翻出以前用VS2010做的老项目,在VS2015中运行ASPX页面浏览,出现错误: HTTP Error 500.23 - Internal Server Error 检测到在集成的托管管道模式下 ...

  6. Mono 3.0.12 支持可移植类库

    Mono 3.0.12已于6月19日发布.对跨平台开发者而言,对可移植类库的支持可能是该版本最重要的变化.该技术可以使一个DLL支持.NET.Windows Store.Windows Phone.S ...

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

    今天在这里跟大家聊聊关于 Windows Universal 应用夸平台的问题,首先Universal Windows App的定义相信大家已经有所了解了(如果你是一个刚刚接触 Universal A ...

  8. .Net 跨平台可移植类库正在进行

    [原文发表地址] Cross-Platform Portable Class Libraries with .NET are Happening [译文发表地址] .Net 跨平台可移植类库正在进行 ...

  9. VS2015搭建GoogleTest框架--配置第一个项目

    最近公司要我学习Google的测试框架google test:https://github.com/google/googletest. GoogleTest是C++的测试框架,我一个学习Java的, ...

随机推荐

  1. 使用Maven私服的好处

    1.Maven仓库的分类 本地仓库:当Maven执行编译或测试时,如果需要使用到依赖文件,它总是基于坐标使用本地仓库的依赖文件.默认情况下,不管Linux还是Windows,每个用户在自己的用户目录下 ...

  2. Atitit.软件兼容性原理与实践 v5 qa2.docx

    Atitit.软件兼容性原理与实践   v5 qa2.docx 1. Keyword2 2. 提升兼容性的原则2 2.1. What 与how 分离2 2.2. 老人老办法,新人新办法,只新增,少修改 ...

  3. ActionBar设置自定义setCustomView()留有空白的问题

    先来看问题,当我使用ActionBar的时候,设置setCustomView时,会留有空白的处理 网上很多朋友说可以修改V7包到19,结果处理的效果也是不理想的. 下面贴出我觉得靠谱的处理代码 pub ...

  4. mac下查看.mobileprovision文件及钥匙串中证书.cer文件

    mac下查看.mobileprovision文件及钥匙串中证书.cer文件 一. mobileprovision文件查看 xxx.mobileprovision是ios开发中的设备描述文件,里面有证书 ...

  5. Oracle 外网访问

    环境:centos7+oracle 11gr2 公网:固定IP 症状:1521端口正常,netmanager配置测试正常,plsql连接提示ORA-12514: TNS:listener does n ...

  6. 国产方法论之 ReDoIt -- 惟思捷

    最近上了PMP课程,感觉受益匪浅,思路有被打开. 很同意一个观点“国人很擅长做事,但是不擅长总结出解决问题的通用框架和方法论”. 为了能提高中小企业生产力我最近成了一个小的软件咨询公司取名“惟思捷”, ...

  7. [Erlang 0112] Elixir Protocols

    Why Elixir   为什么要学习Elixir?答案很简单,为了更好的学习Erlang.这么无厘头的理由? Erlang语法设计几乎没有考虑过取悦开发者,所以学习之初的门槛略高.对于已经克服了最初 ...

  8. 关于对For循环嵌套优化的问题

    1.案例描述 由于一次Java面试的笔试题,当时没有写出很好的解决方案,特此专门撰写一篇博客来加以记录,方便日后的查看 面试题目如下:从性能上优化如下代码并说明优化理由? for (int i = 0 ...

  9. transactionManager 以及datasource type解析

    transactionManager 在 MyBatis 中有两种事务管理器类型(也就是 type=”[JDBC|MANAGED]”): JDBC – 这个配置直接简单使用了 JDBC 的提交和回滚设 ...

  10. Ajax中POST和GET的区别

    Get和Post都是向服务器发送的一种请求,只是发送机制不同. 1. GET请求会将参数跟在URL后进行传递,而POST请求则是作为HTTP消息的实体内容发送给WEB服务器.当然在Ajax请求中,这种 ...