近期Visual Studio推出Mac版本号的消息迅速在技术圈里刷屏,当project师们最喜欢的笔记本电脑Mac,邂逅地球上最强大的集成开发环境Visual Studio的时候,会碰撞出如何精彩的火花呢?在微软新任CEO纳德拉的“移动为先、云为先”战略下,微软的转变渐渐開始让人欣喜。从.NET Core、VSCode、TypeScript再到近期的Visual Studio For Mac,这一系列动作让我们感觉到。微软的技术栈越来越多地向着开源和跨平台两个方向努力。

我们曾经固执地觉得。微软的技术栈注定永远无法摆脱Windows的束缚,而其实这个世界每天都在发生着变化。也许这次Visual Studio推出Mac版这件事情,本质上是微软收购的Xamarin公司旗下产品Xamarin Studio的一次改头换面。但是这件事情说明。微软正在努力让.NET技术栈融入很多其它的应用场景。对我而言,我是没有钱去买一台Mac的,所以在这篇文章中,我们将在Linux下通过Mono和VSCode来打造一个轻量级的IDE。

而据说Mono会和Xamarin一样。将来会成为.NET基金会的一部分。

  好了,我们首先在Windows世界里进行彩排。在開始以下的内容曾经,请保证你的计算机上安装了Mono和VSCode。假如你常常关注我的博客,你应该会知道Mono在这里的作用是什么?。简而言之,Mono为我们提供了编译器环境和执行时环境。在这个基础上VSCode这个天生带着Visual Studio基因的编辑器,则能够为我们提供基础的代码调试功能。这是我们这篇文章写作的关键因素。

假设你还对Mono一无所知,以下的两篇文章能够帮助你高速了解:

  在我们了解了Mono以后,就能够考虑将Mono作为VSCode的执行时环境,这意味着我们能够在使用VSCode的同一时候直接编译代码。眼下在VSCode中内建的执行时支持为Node/Node2,所以假设我们希望在VSCode中调试很多其它的语言。我们就必须要为VSCode安装对应的插件。

由于其实在VSCode中编译代码我们能够直接通过Task来完毕编译,但当我们希望在VSCode中对代码进行调试的时候,我们就必须借助插件来完毕调试任务。这也许从側面印证了VSCode的产品定位就是一个文本编辑器。

  而对于微软推出的这样一款产品,我们也许会疑惑。为什么这个编辑器提供的内建支持竟然是Node,而不是我们所熟悉的.NET技术体系。这个原因很easy理解,假设你听说过Github出品的编辑器Atom,或者是使用过Electron/Node-Webkit相关技术,那么你一定会深刻地理解,VSCode本质上和Atom一样。都是採用Web技术来构建跨平台应用,而Node天生就具备Web属性加成。所以我们就不难理解为什么VSCode内建的支持是Node而非.NET技术体系。相同地,为了实现跨平台的目标,在对C#语言的支持这个问题上,微软选择了OminiSharp这样一个跨平台的代码自己主动补全工具,而非我们在Visual Studio中所熟知的Intellisense技术。

在.NETCore推出以后.NET跨平台不再是梦想,我们对技术的探索就不应该再局限在Windows平台上。

  博主关注Mono始于Unity3D引擎,由于Mono真正实现了.NET技术的跨平台,而Unity3D引擎最为人所称道的当属其强悍的跨平台能力。在这一点上Mono功不可没。在此之前收费的Xamarin让人望而却步。所以Mono自然而然地就成为了我的选择。由于博主的计算机上安装了Mono,所以在一開始使用VSCode的时候,就先入为主地觉得在不安装插件的情况下,应该就能够直接在VSCode中编译和调试代码了。首先我们在VSCode中创建一个C#代码文件,既然在程序世界里万事万物都从Hello World说起,那么我们这里依旧遵循这个原则。在创建该代码文件以后。我们将其所在的文件夹在VSCode中打开,这是由于:

在VSCode中仅支持以文件夹方式打开的文件的编译和调试

所以这个时候我们在VSCode中的界面应该是如图所看到的:

好了,以下我们直接按下Ctrl+Shift+B来编译代码。此时VSCode将提示我们“配置任务执行程序”,这里须要说明的是,在VSCode中你能够感受到微软对命令行和配置文件的偏执。这让适应了Visual Studio这样功能强大的我们相当不习惯,依照VSCode的提示或者是通过Ctrl+Shift+P打开命令面板,VSCode将在当前工作文件夹下为我们创建.vscode文件夹和tasks.json文件,在VSCode中不论什么和项目相关的配置信息都会存储在这里啦。此时我们配置tasks.json:

{
    // See https://go.microsoft.com/fwlink/?

LinkId=733558
    // for the documentation about the tasks.json format

    "version": "0.1.0",
    // 该命令须要在系统变量内定义
    "command": "mcs",
    // 或者使用完整的可执行路径
    // "command: "C:\Program Files\Mono\bin\mcs.exe"
    "isShellCommand": true,
    "args": ["*.cs"],
    "showOutput": "always"
}

在这里须要说明的是一个tasks.json中能够通过tasks属性来配置多个任务执行程序。比如我们的项目中有Python和C#两种代码须要编译。那么我们就能够配置两个task,VSCode将在执行程序的时候让用户由哪一个task来编译代码。假设你看过我在前面介绍过的两篇文章,就应该知道这里的mcs.exe其实是Mono提供的C#编译器。它负责将我们的C#代码编译为IL文件,然后IL文件再交由CLR来转换为本机代码。Mono提供的C#编译器能够将C#代码编译为.exe或者是.dll。但是在VSCode中好像默认都是编译为.exe。所以假设有知道如何在这里配置编译输出项的朋友。希望能够告诉我怎么去实现。

  如今,我们应该会得到一个MainClass.exe的文件,最初博主尝试直接去配置launch.json,发现直接填写type为mono在VSCode中是无法识别的,最后决定去安装mono-debug的插件。安装插件在VSCode中是很简单的。按下Ctrl+Shift+X打开插件界面。能够在这里查看最流行的插件列表、官方推荐的插件列表等等,我们直接搜索mono-debug然后安装插件就可以。但是我不曾想到的是,我猜中故事的开头,却没有猜中故事的结尾,这个插件是不支持Window平台的这个插件是不支持Windows平台的这个插件是不支持Windows平台的

  好吧,如今看起来Linux是我唯一能够去尝试的平台了。博主这里选择的是颜值最高的Elementary OS。这是一个衍生自Ubuntu的Linux发行版。在VSCode正式版公布以后。在Linux下用VSCode来编程是我一直在尝试的事情,请不要说Linux系统使用起来会很困难。博主在安装这些软件的过程中能够说是相当顺利。建议大家在Linux平台下安装C#、Mono-Debug和Python这3个插件。须要说明的是C#和Mono-Debug在第一次使用的时候,须要在网络环境下下载相关依赖。以下是博主眼下的插件安装情况:

  我们如今按F5进行调试。和编译时一样。假设用户没有为当前项目配置“任务调试程序”。VSCode会提示我们去创建一个配置文件launch.json,我们这里选择mono。该选项在安装Mono-Debug插件曾经是没有的,该配置文件例如以下,我们注意到这里须要改动program属性为MainClass.exe:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch",
            "type": "mono",
            "request": "launch",
            "program": "${workspaceRoot}/MainClass.exe",
            "args": [],
            "cwd": "${workspaceRoot}",
            "preLaunchTask": "",
            "runtimeExecutable": null,
            "env": {},
            "externalConsole": false
        },
        {
            "name": "Attach",
            "type": "mono",
            "request": "attach",
            "address": "localhost",
            "port": 5085
        }
    ]
}

  这里有一个小插曲。在博主执行这个简单的程序的时候,提示Mono的版本号和Mono-Debug插件的版本号要求不一致,由于Mono-Debug插件使用的是最新版本号的Mono。所以。果断卸载眼下的mono,然后安装最新的mono。安装方法为:

sudo apt-get install mono-complete

这样我们就能够看到眼前的成果啦,我们成功地在VSCode执行了一个C#程序:

  尽管我很想在这篇博客中搞点干货出来。但是当我折腾数天以后。我大概就能够写出这样一篇相当零碎的文章。到眼下为止我还是没有搞明确,为什么我在调试地过程中,VSCode不会在我设置了断点地地方停下来。希望知道这个原因的朋友能够告诉我啊。这个过程最有意义的地方在于让我进一步熟悉了Linux。在不一样的地方。会有不一样的风景。这个世界很大,不要给自己设限。兴许我会去研究VSCode中的调试技巧以及.NETCore相关内容。能看到C#跨平台执行是件幸福的事情,而跨平台开发是我一直在探索的方向之中的一个。夜晚已然来临了。而这篇文章就是这样了。谢谢大家的关注,晚安!

基于Mono和VSCode打造轻量级跨平台IDE的更多相关文章

  1. 基于netty http协议栈的轻量级流程控制组件的实现

    今儿个是冬至,所谓“冬大过年”,公司也应景五点钟就放大伙儿回家吃饺子喝羊肉汤了,而我本着极高的职业素养依然坚持留在公司(实则因为没饺子吃没羊肉汤喝,只能呆公司吃食堂……).趁着这一个多小时的时间,想跟 ...

  2. 基于java.util.logging实现轻量级日志记录库(增加根据当前类class初始化,修复线程池模型(javaEE)下的堆栈轨迹顺序与当前调用方法不一致问题)

    前言: 本章介绍自己写的基于java.util.logging的轻量级日志记录库(baseLog). 该版本的日志记录库犹如其名,baseLog,是个实现日志记录基本功能的小库,适合小型项目使用,方便 ...

  3. 基于zepto的移动端轻量级日期插件

    前言 做过移动Web开发的同学都知道,移动端日期选择是很常见的需求.在PC端,我们有很丰富的选择,比较出名的就有Mobiscroll和jQuery UI Datepicker.个人看来,这些插件存在的 ...

  4. 玩node-images模块---Node.js轻量级跨平台图像编解码库

    Node.js轻量级跨平台图像编解码库 github:https://github.com/zhangyuanwei/node-images Features 功能特性 轻量级:无需安装任何图像处理库 ...

  5. AutoSharedLibrary -- 基于模板元编程技术的跨平台C++动态链接载入库

    基于模板元编程技术的跨平台C++动态链接载入库.通过模板技术,使用者仅需通过简单的宏,就可以使编译器在编译期自己主动生成载入动态链接库导出符号的代码,无不论什么额外的执行时开销. extern &qu ...

  6. 自己动手,打造轻量级VSCode/C#环境代替LinqPad

    .Net 的项目都挺重的,一直想找一个轻量级的 CSharp 环境,能像Python那样,选一个文件就能跑的.之前用的是 LinqPad,但它的缺点也很明显: (1)     不付费,自动完成不能用( ...

  7. 基于Mono跨平台移动应用开发框架发布Xamarin 3.0

    跨平台移动应用开发框架Xamarin可以让你完全用C#编写你的应用程序,在iOS.Android.Windows Phone 8.Windows8和mac平台上共享相同的代码.你可以重用你最喜欢的.N ...

  8. 轻量级跨平台消息传递协议XML-RPC深度解析

    一.引言 实现跨平台通信的协议主要有简单对象訪问协议(Simple Object Access Protocol,SOAP).代表性状态传输(Representational State Transf ...

  9. 打造轻量级自动化测试框架WebZ

    一.什么是WebZ WebZ是我用Python写的“关键字驱动”的自动化测试框架,基于WebDriver. 设计该框架的初衷是:用自动化测试让测试人员从一些简单却重复的测试中解放出来.之所以用“关键字 ...

随机推荐

  1. C#.NET微信公众账号接口开发系列文章整理--微信接口开发目录,方便需要的博友查询

    前言: 涉及微信接口开发比较早也做的挺多的,有时间的时候整理了开发过程中一些思路案例,供刚学习微信开发的朋友参考.其实微信接口开发还是比较简单的,但是由于调试比较麻烦,加上微信偶尔也会给开发者挖坑,并 ...

  2. spring-自动加载配置文件\使用属性文件注入

    在上一篇jsf环境搭建的基础上 , 加入spring框架 , 先看下目录结构 src/main/resources 这个source folder 放置web项目所需的主要配置,打包时,会自动打包到W ...

  3. UWP开发入门(十五)——在FlipView中通过手势操作图片

    本篇的最终目的,是模拟系统的照片APP可以左右滑动,缩放图片的操作.在实现的过程中,我们会逐步分析UWP编写UI的一些思路和技巧. 首先我们先实现一个横向的可以浏览图片的功能,也是大部分APP中的实现 ...

  4. DNS报文格式

    原文链接地址:http://blog.chinaunix.net/uid-24875436-id-3088461.html DNS报文格式(借个图贴过来):     说明一下:并不是所有DNS报文都有 ...

  5. Mybatis框架_part1

    mybatis介绍 mybatis就是一个封装了jdbc的持久层框架,它的前身是ibatis.Mybatis与hibernate一样都是持久层框架,但是它与hibernate不同的是,它不是一个完全的 ...

  6. Python给小说做词云

    闲暇时间喜欢看小说,就想着给小说做词云,展示小说的主要内容.开发语言是Python,主要用到的库有wordcloud.jieba.scipy.代码很简单,首先用jieba.cut()函数做分词,生成以 ...

  7. ubuntu11.04安装nginx+php+mysql

    先列参考内容,后面我再补充点东西: http://www.4wei.cn/archives/1001436 http://www.gidot.net/blog/article.asp?id=322 上 ...

  8. github的使用心得

    我的github地址:https://github.com/gaino1/test GitHub 是一个用于使用Git版本控制系统的项目的基于互联网的存取服务. GitHub可以托管各种git库,并提 ...

  9. 无法找到“XXX.exe”的调试信息,或者调试信息不匹配。未使用调试信息生成二进制文件

    1.问题症状 已经处于Debug模式,运行时完全正常,但是一调试就出现对话框,显示出错信息:“无法找到“XXX.exe”的调试信息,或者调试信息不匹配.未使用调试信息生成二进制文件.” 2.解决方法 ...

  10. C51中的xdata

    今天在写公司芯片对应的.H文件时,在定义寄存器的时候出现一个问题. 我们芯片的寄存器地址是定义在片外RAM区的,不能使用sfr这样的关键字来进行定义. 后来查阅了对应的资料才发现定义寄存器有很多种方法 ...