“前.NET Core时代”如何实现跨平台代码重用 ——源文件重用

微软在2002年推出了第一个版本的 .NET Framework,这是一个主要面向Windows 桌面(Windows Forms)和服务器(ASP.NET Web Forms)的基础框架。在此之后,PC的霸主地位不断受到其他设备的挑战甚至取代,为此微软根据设备自身的需求对.NET Framework作了相应的简化和改变,不断推出了针对具体设备类型的.NET Framework,主流的包括Windows Phone、Windows Store、Silverlight和Xbox等,它们分别对移动、平板和游戏设备提供支持。由于这些不同的.NET Framework是完全独立的,这使我们很难开发一个支持多种设备的“可移植(Portable)”应用。与此同时,通过借助于Mono,.NET已经可以被成功移植到包括Mac OS、Linux、iOS、Android和FreeBSD等非Windows平台。

对于包括Mono在内的各个.NET Framework平台的BCL(Basic Class Library)来说,虽然在API定义层面上存在一些共同之处,但是由于它们定义在不同的程序集之中,所以在PCL(Portal Class Library)推出之前,针对程序集的共享是不可能实现的,我们只能在源代码层面实现共享。源代码的共享通过在不同项目(针对不同.NET Framework平台)之间共享源文件的方式来实现,至于具体采用的方式,我们有三种不同的方案供你选择。

一、源文件共享

对于一个能够多个针对不同.NET Framework平台的项目共享的源文件,定义其中的代码也有不少是针对具体某个.NET Framework平台的。对于这种代码,我们需要按照如下的方式进行编写,相应的项目以添加编译的方式选择与自身平台相匹配的代码编译道生成的程序集中。

   1: #if WINDOWS
   2:     <<针对Windows Desktop>>
   3: #elif XBOX
   4:     <<针对 Xbox>>
   5: #elif WINDOWS_PHONE
   6:     <<针对Windows Phone>>
   7: #else
   8:     <<针对其他平台>>
   9: #endif

如果多个针对不同.NET Framework平台的项目文件存在于同一个物理目录下,存在于相同目录下的源文件可以同时包含到这些项目中以实现共享的目的。如下图所示,两个分别针对Silverlight和WPF的项目共享相同的目录,与两个项目文件同在一个目录下的C#文件Shared.cs可以同时被包含到这两个项目之中。

二、文件链接

当我们采用默认的方式将一个现有的文件添加到当前项目之中的时候,Visual Studio会将目标文件拷贝到项目本地的目录下,所以根本起不到共享的目的。但是针对现有文件的添加支持一种叫做“链接”的方式使添加到项目中的文件指向的依然是原来的地址,我们可以为多个项目添加针对同一个文件的链接以实现源文件跨项目共享。同样还是上面演示分别针对Silverlight和WPF的两个项目,不论项目文件和需要被共享的文件存在于哪个目录下面,我们都可以采用如下图所示的添加文件链接的方式分享这个Shared.cs文件。

三、Shared Project

项目的目的一般都是组织源文件和其他相关资源并最终编译成一个可被部署的程序集。但是Shared Project这种项目类型则比较特别,它只有对源文件进行组织的功能,却不能通过编译生成程序集,它存在的目的就是为了实现源文件的共享。对于上面我们介绍的两种源代码的共享方式来说,它们都是针对某个单一文件的共享,而Shared Project则可以对多个源文件进行打包以实现批量共享。

如下图所示,我们可以创建一个Shared Project类型的项目Shared.shproj,并将需要共享的三个C#文件(Foo.cs、Bar.cs和Baz.cs)添加进来。我们将针对这个项目的引用同时添加到一个Silverlight项目(SilverlightApp.csproj)和Windows Phone项目(WinPhoneApp.csproj)之中,当我们对这两个项目实施编译的时候,包含在项目Shared.shproj中的三个C#文件会自动作为当前项目的源文件参与编译。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Crossin的编程教室

Windows 下的包管理器

这是一篇读者投稿。 包管理器的概念源自 Linux,与 Windows 单独下载安装软件不同,包管理器可以管理各种软件,做到统一的安装、更新和删除。某种程度上来...

36350
来自专栏walterlv - 吕毅的博客

自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference

发布于 2018-04-24 10:03 更新于 2018-06...

18620
来自专栏blackheart的专栏

MSBuild入门

MSBuild是什么? MSBuild全称(Microsoft Build Engine),是用于构建应用程序的平台。您可能不知道它,但是如果您在使用VS做开发...

25280
来自专栏GuZhenYin

SignalR系列续集[系列8:SignalR的性能监测与服务器的负载测试]

前言 也是好久没写博客了,近期确实很忙,嗯..几个项目..头要炸..今天忙里偷闲.继续我们的小系列.. 先谢谢大家的支持.. 我们来聊聊SignalR的性能监测...

27160
来自专栏练小习的专栏

模拟微信支付宝密码输入框的效果

中午听到别人在讨论微信的支付框以及支付宝的支付框,于是自己写了个demo出来,原理很简单,通过隐藏input,使用label控制显示,实现起来很容易。唤起数字键...

31550
来自专栏腾讯玄武实验室的专栏

深入解析 DLL 劫持漏洞

2010 年 8 月,微软发布安全通报 2269637,同时网上公布了大量受影响软件的名字,DLL 劫持漏洞开始进入大家的视野。

85300
来自专栏游戏杂谈

解决Visual Studio 2010过卡的问题

装了Visual Assists 插件后,开发中经常会导致整个电脑都处于“挂起”的状态,任务管理器都打不开。后来修改了一下设置,现在已经正常了…

29630
来自专栏深度学习那些事儿

最新VS for Mac离线安装教程汇总!

VS大家都知道,大名鼎鼎的Visual Studio、功能强大的IDE,这里汇集了VS在mac OS系统上的各种下载方式和下载步骤,博主被折腾的死去活来于是会对...

1.2K30
来自专栏张善友的专栏

Windows Server AppFabric正式发布

Windows Server AppFabric 是一组集成技术,可更轻松地生成、扩展和管理 IIS 上运行的 Web 应用程序和复合应用程序,它是一款主要面向...

21780
来自专栏FreeBuf

如何利用日志来监控和限制PowerShell攻击活动

写在前面的话 近期,我一直在我客户的网络环境中分析PowerShell攻击,根据我的分析以及研究结果,我发现了几种方法来帮助研究人员检测潜在的PowerShel...

27250

扫码关注云+社区

领取腾讯云代金券