APP下载

C#语言跨平台研究与实践

2019-07-08张浩

电脑知识与技术 2019年13期
关键词:跨平台语言

张浩

摘要:C#作为一种被广泛使用的开发语言除了运行在windows平台之外,越来越多的需求希望其可以支持跨平台的开发和部署,而这其中有很多的技术概念、方案思路需要梳理,以及很多因素和细节需要澄清和验证。该文将会探讨C#语言目前所支持的跨平台可行性技术方案,在目前主流的Windows和Linux版本下进行了具体的实践验证,并展望未来的发展方向。

关键词:C#语言;跨平台;Linux

中图分类号:G642        文献标识码:A

文章编号:1009-3044(2019)13-0109-04

Abstract: C# language is more and more popular programing language that is expected to

support cross-platform development and deployment not only running on Windows but also  running on Linux platform. There are many technical concepts, solutions and ideas that need to be combed, and many factors and details need to be clarified.This paper will discuss C# language portability and solution of cross-platform, verify in the current main versions of Windows and Linux and look forward to the future Development direction.

Key words: C # language; cross-platform; Linux

1 概述

在企業实际的应用项目开发中,由于应用场景的需要或是客户的直接需求,希望所开发的应用程序,能够跨平台运行。对于开发团队来讲,希望通过对某种语言的一次性编写及对一套代码的一次编译,就可以实现应用程序的跨平台运行。例如,所开发出的应用程序既可以在Windows下运行又可以在Linux下运行,这样可以提高程序的开发效率而无需进行基于某个特定平台的开发,无需维护多套代码,从而提高了应用程序的可移植性。

C#语言是一种很受欢迎的主流编程语言,其综合了C++和JAVA的很多优点,具有编译快,执行效率高等特点,再加上微软提供的强大的可视化Visual Studio集成开发环境和所支持的类库,使得C#的开发效率较高,从而到了广泛的应用,是应用软件开发的主流趋势之一。

然而,由于历史原因C#语言及其经典的.net framework类库,实际上是绑定了windows的开发及运行平台。无法移植到Linux上使用,这制约了项目开发部署的灵活性和可移植性。而利用C#语言的优秀特性和其强大的类库,实现跨平台的开发运行又是一个不错的构想。也就是实现代码编写后的“一次编译到处运行”的构想。对于目前的基于C#技术的软件系统来讲,结合需求,如果可以做到一次开发至少可以在Windows和Linux两种平台下运行的构想也是很不错的。以上构想如果可以实现,对于编程语言的统一开发、构建、部署及运行调试都有重要的意义。可以提高软件的开发效率和降低维护的成本,对增加代码编写的可移植性和模块部署的灵活性都有很大意义,在一定程度上有利于提高行业应用软件自主化的程度,降低运营成本。

2 C#跨平台相关技术路线

目前支持C#语言开发环境及类库的情况总览如下图:

2.1 C#语言及环境

一种语言要想在某个平台上编译和运行,必须具有在该平台之上所支持的开发编译环境和运行环境。也就是说,一个应用程序实际上是使用一种语言(例如C#)基于一个平台(Window),利用某个类库框架(.net framework)运行在某个运行环境之上(CLR运行时库)的应用程序。

一个.NET应用是一个使用.NET Framework类库来编写和编译,并运行于公共语言运行时 Common Language Runtime之上的应用程序。

2.2 C#语言遵循规范——通用语言基础结构(Common Language Infrastructure,CLI)

C#遵循CLI语言规范,理论上,只要遵循如上规范,就应该具有平台的无关性。CLR实际上是提供了一项使用了虚拟机技术的产品,他构架在操作系统之上,并不要求程序的运行平台是 Windows系统,只要是能够支持它的运行库的系统,都可以在上面运行.NET应用。所以,一个完全由托管代码组成的应用程序,只要编译一次,就可以在任何支持.NET的平台上运行。

但现状是.net framework 的CLR是微软公司对CLI的实现,由于微软的战略上及历史原因,实际上到目前为止,.net framework仍然是Windows平台的实现版本,未能够实现跨平台的框架,或者说.net framework是Windows平台的专有实现,发挥了Windows平台的最大优势及平台相关的特性,并不是为跨平台准备的解决方案。

2.3 跨平台社区的兴起及Mono的出现

在Mono的官网上https://www.mono-project.com/是这样描述定义Mono的:

Mono is a software platform designed to allow developers to easily create cross platform applications part of the .NET Foundation.

Mono被这样定义:Mono是一个旨在提供给开发者易于创建跨平台应用程序的软件平台,是.Net 基金会的组成部分。

我的理解是Mono是一个软件平台,是开源的、跨平台的.Net 框架实现版本。我们应用软件项目所关心的,实际上是基于Linux的C#.net framework桌面程序的实现版本,本文也是以此为研究方向。

2.4 Mono与Microsoft的合流

Xamarin公司是Mono项目的主导者,还包括提供移动端iOS、Android等多种系统的跨平台实现。Mono项目原来由Xamarin公司主导,后来被微软收购,实现了合流。这使得很多的基于Windows的IDE的开发者期待VisualStudio提供更强大的跨平台的集成开发环境。目前微软公司的最新主流产品Visualstudio2017的产品也正是给了人们一些这样的期待,但目前做得并不好,而且多种特性和各种向导整合在一起也是让人感觉有些凌乱。也许微软公司在接手Mono之后,再加上原来的windows版的.net framework和各种移动端的开发,还没有完全理顺Mono、.net framework和.net Core等框架关系,或者至少还没有向人们解释清楚现状和未来的发展方向。

2.5 Mono、.Net Core和.Net Framework

1) 所谓.Net Core: 是微软新一代的、第一个开源的、具有跨平台能力的应用程序开发框架,支持在Window,macOS,Linux等系统上的开发和部署,并且可以在硬件设备,云服务,和嵌入式/物联网方案中进行使用,这是微软对.Net Core的定位[1]。

可以理解为,.Net Core是基于Windows的传统.Net Framework的升级和重构,但不是简单包含和兼容关系,.Net Core具有很多新的特性,定位也高于传统的.Net Framework,是微软公司新的.net 框架的战略升级。.Net Core基于跨平台能力,目前并没有将与 GUI 高度相关的 API 移植到 .NET Core 内,因此像是Windows Forms或是Windows Presentation Foundation(WPF) 并未移植到 .NET Core。

目前VS2017集成开发环境的.NET Core 仅支持控制台应用程序 (Console Application) 以及类库 (Class Library) 类型的项目。因此.Net Core不支持桌面的WinForms和WPF的应用开发。

2) Mono:可以理解是Mono.Net Framework的跨平台实现,他是支持.net框架应用模型的子集,例如支持基于WinForms的应用模型开发,但不支持WPF。支持.NET Framework APIs中的大多数甚至使用相同的程序集名称。

3) 他们之间的关系:Mono要早于并独立于.Net Core,自成体系,后来被微软收购,他们共存、各有特点、互相补充。目前来讲,.net Core和Mono互补的提供了不同方式应用模型的解决方案。也就是说从目前来看,传统的基于Windows的.Net Framework、Mono和新生的.Net Core成三足鼎立之势。但从长远来讲,可以预见.Net Core是微软公司的一个重要战略,基于windows的.Net Framework和跨平台的.Net Core将共同遵循一套标准和基础设施,以提高维护的统一性,面向特定平台/跨平台的应用。Mono和经典的.Net Framework将会因为.Net Core的升级而发生演变,我们拭目以待。

2.6 Mono跨平台的支持范围

Mono目前实现跨平台的.Net类库实际上是基于windows的.Net Framework的一個子集:

1) 目前支持:支持控制台的应用模型和WinForms的桌面的应用模型,以及其他一些移动端平台的应用。在于.Net Framework 兼容性方面,Mono的官网这样描述:

The easiest way to describe what Mono currently supports is: Everything in .NET 4.7 except WPF, WWF, and with limited WCF and limited ASP.NET async stack.

Mono对于.NET 4.7框架中除了不支持WPF, WWF之外,以及部分有限的支持WCF及ASP.NET 异步栈的特性之外,支持其他所有特性。

2) 不支持:目前Mono不支持WPF跨平台

有关WPF,Mono的官网上特地给予了明确的说明:

At this point, no group in the Mono project has plans to implement Windows Presentation Foundation APIs as part of the project. We do not have any plans because the project is too large and there has not been any serious interest from the community to make this effort move forward.

这方面,Mono项目组中没有任何实现WPFAPI的计划。我们连这方面的计划都没有,是因为这个项目太大而且社区也没有对于这方面太多的兴趣而为此推动他前进。

3 C#语言跨平台实践

3.1 方向目标

1) 根据以上的调研基础,结合行业应用软件的特点,我们的主要感兴趣的是如何使用C#开发基于桌面的跨平台应用程序。C#语言对于界面程序,除了WPF之外,目前以WinForms的应用场景最为广泛,目标也是想以Windows平台为开发和集成调试环境,而基于Windows/Linux平台的部署应用。开发人员的工作环境一般如下:

2) 开发环境:

Windows平台+VisualStudio2017+.Net Framework +Mono VS Add-in

(Cross compiler/Debug)

3) 运行环境:

Windows+ .Net CLR或者Linux+Mono.Net CLR

4) 也就是说我们按照VS2017+Mono交叉编译、调试插件+Mono编译/运行环境+WinForms应用模型,同时运行于Win10和CentOS7.5下的测试路线开始Demo程序的编写和环境的搭建及调试。

3.2  特定(版本)开发及运行环境的搭建

1) Windows以Win10为测试环境

2) Linux以CentOS7为测试环境(CentOS Linux release 7.5.1804 (Core))(本示例采用基于VMwareWorkstation的CentOS7.5的Linux虚拟机环境)。

3) Mono环境为Mono5.10.1.57版本 结合VS2017的Mono扩展编译调试插件。

4) 开发环境VS2017+ MonoTools.vsix1.0.0(Mono交叉编译、调试的扩展插件)。

3.3 Mono和VisualStudio的集成

1) 与VS集成的Mono编译/调试插件MonoTool1.0.0

在Windows上安装好Mono环境包后,可以利用Mono提供的命令行对现有的C#代码进行编译和运行。另外,基于Windows的开发环境是VS2017,目前可以采用一个对应VS的Mono扩展插件,可以在VS集成开发环境中进行交叉编译和调试运行。

3.4 C#跨平台Demo搭建过程简述

1) 在Windows中安装VS2017,选中所需要的安装负荷组件;

2) Mono官网下载并分别安装基于Windows下和Linux下的Mono运行环境;

3) 在Windows下安装VS2017的Mono扩展插件并配置Mono的安装路径;

4) 测试运行环境是否安装成功

可以分别在Windows和CentOS中使用命令行测试环境是否安装成功。

为了测试核心编译器(mcs)和运行时(mono),可以创建一个简单的控制台程序进行编译/运行测试。下面是Linux测试环境的举例:

$ mcs  Demo.cs   //编译命令

$ mono Demo.exe//运行命令

如果运行正常可以产生类似于“HelloWorld”字样的输出,表示环境安装成功。

5) 在Win10下利用Vs2017开发一个基于WinForms的对话框程序,并作如下测试:

① 新建一个Tree View控件并添加一些子节点,创建几个button,添加树形控件双击消息响应函数,弹出消息提示框,在Win10下编译运行。

② 用Mono菜单在VS2017中调用Mono插件进行交叉编译生成可跨平台的目标文件。

③ 在Window10下观看运行效果

④ 在CentOS7下直接运行在Windows下已经编译好的目标文件,查看运行效果。

在CentOS下运行Windows下经过交叉编译器构建的目标文件,运行效果。

3.5 实践结论

1) Windows和Linux平台下都要安装好Mono的编译运行环境才可以。

2) 在Windows平台下,只要开发和编译环境搭建好,可以利用Mono的交叉编译器对如上的WinForms的Demo进行一次编译,便可以不经过代码的修改在已经安装了Mono的Linux平台下运行,也就是说可以利用Mono进行一次编译,实现两个平台的多处运行。

3) 该Demo基于.Net Framework的WinForms模型,可以看到基本的button和Tree view控件事件响应函数都可以跨平台运行。

4 C#跨平台技术的注意事项

在如上的示例中成功地演示了C#语言编写的WinForms程序的跨平台运行,但是需要注意的是,基于Mono的C#编写的可以跨平台应用程序需要符合一定的约束要求。

1) 编写跨平台的C#代码,要特别注意编程规范,以便易于移植,禁止调用平台特性相关的API函数和类库,使得代码不需要进行修改,而更容易进行轻松的移植。

2) 目前很多软件为了达到一定的界面风格效果,使用了第三方的界面库,开发人员如果需要使用这样的界面库,则要确认该界面库,是否是基于Winform的并且可以对源码进行基于Mono环境的编译并测试,如果是基于WPF的界面库则不能进行移植。

3) C#实现的应用程序在一次编译后可以运行在不同的平台,需要在不同的平台进行对等的测试,而不能以一种平台的测试代替另一种平台的测试。

5 结论

以上实践以桌面程序为例,成功的实现了C#基于Winform的应用程序在Windows下的开发和编译并可以跨平台运行于Windows和Linux较新的主流操作系统版本上运行,是一个可行的解决方案。

5.1  开发平台所使用的工具环境

如果需要开发跨平台的C#,其开发环境和平台建议使用Windows10+VisualStudio2017的集成开发环境,另外一种方案是使用Mono Develop(XamarinDevelop),尽管该软件也有Windows的版本,但其编译、安装配置过程比起前者烦琐很多,使用过程中出现这样那样的问题,解决起来也耗时费力,开发人员应该将主要精力用于业务需求本身而不是烦琐的安装及编译环境的搭建和配置,这也是在Windows下进行开发的优势。

5.2 跨平台技术还在整合

现有代码的可移植性,其实就现有阶段来讲,目前最成熟可行的跨平台解决方案就是基于C++ 的QT技術,但C#由于其本身的优秀特点,发展势头很猛,微软也开始重视这一领域。

5.3 C#跨平台技术的展望

Mono项目尽管已经进行了较大发展,但对于强大的C#语言和类库的实现其实也还是新鲜事物,其和微软整合的时间也不长,今后产生较大变化的可能性很高,到目前为止Mono对于C#.Net框架也仅仅实现了部分子集,微软收购Mono如何对现有的技术进行定位和整合,例如,.net Core以后是否可以支持桌面应用的跨平台,如果支持了和Mono的兼容性如何处理,使用Mono实现的代码是否还需要或能够简单的移植到.net Core上面。

根据以上展望,我们相信微软与Mono整合以后,C#作为一种优秀的语言,其跨平台的可移植性技术方案将会更加广泛和成熟。

参考文献:

[1] Christian Nagel. C#高级编程[M]. 李铭,译.10版.北京: 清华大学出版社,2017.

【通联编辑:王力】

猜你喜欢

跨平台语言
跨平台APEX接口组件的设计与实现
让语言描写摇曳多姿
累积动态分析下的同声传译语言压缩
基于QT的跨平台输电铁塔监控终端软件设计与实现
基于OPC跨平台通信的电机监测与诊断系统
基于B/S的跨平台用户界面可配置算法研究