ReLive:将Alive移植到VS2017

之前我写过一篇介绍VS插件Alive的文。Alive是一个(半)实时动态显示C#代码执行结果的插件,效果还是不错的。但是后来开发商CodeConnect被MS收购了,从此Alive就再也没更新过。官方博客表示将来它可能会成为VS内置功能,这本是一件皆大欢喜的事情,但是VS2017也已经更新了三个版本了,仍然没有它的影子,而Alive是无法在VS2017上使用的……一年来我的坑也逐渐用上了各种C#7的特性,实在没办法停留在VS2015了。于是我决定把Alive移植到VS2017。花了两天时间基本移植完了,偶尔抛出的异常日后再慢慢研究吧。

其实这个移植并没有太多的技术难度。但出于版权原因我当然不会公开提供,毕竟这个插件试用完了还是要收费的,虽然现在被巨硬收购之后已经不再卖了。

下图是ReLive运行在VS2017上的效果。

我还顺手做了本文开头那个充满恶意的图标。没错,ReLive这个名字就是来源于ReLIFE……

下面是本次移植过程中遇到的玄学:

VS插件的功能划分有好多种类型,比如Adornment(装饰,在文本或者界面上显示一些东西)、Command(用菜单或者快捷键触发的功能)、Tool Window(可停靠的窗口)、Package(复杂类型)等等。你需要加哪种功能,就在项目管理器中右键——新建项——扩展性——选择一个功能添加。但是这里面貌似有一个坑,那就是直接从别的项目里把对应的源文件复制进来添加上并不会在这个项目里“开启”这种功能的加载。比如你新开了一个只有Package的插件项目,然后从另一个项目里复制了一个Adornment进来。编译之后,你可能会发现Adornment没加载。这时候,你需要在项目里按照流程添加一个Adornment,这样才会开启所有Adornment的加载。随后你可以把新添加的Adornment删掉了,而你引进的Adornment也会正确加载了。同理,绝不能直接从别的项目复制Package,否则你可能会发现自始至终Package的初始化方法都没执行过。

从别的项目复制一个XAML进来,VS会突然智障,会把XAML编译生成的两个中间文件【g.cs】【g.i.cs】都进行分析,结果就是告诉你,你所有出现在XAML里的字段都重复定义了——两个中间文件里各有一份定义呢。这个问题虽然会导致你的代码和错误窗口呈“满江红”之势,但实际不影响编译。

在nuget里拖一个Roslyn(Microsoft.CodeAnalysis),如果不是.NET Core/.NET Standard项目,请在点“同意”之前注意看依赖项有哪些。nuget可能会把整个BCL给你装上。虽然上面写着不建议单独安装,但一些常用的库(CodeAnalysis、CSharp、VisualBasic、Workspaces等)还是可以单独安装的,只要在nuget中选择“忽略依赖项”即可。

VS插件中的Package项目一定要确保作为VsPackage类型(而不是很有迷惑性的Assembly类型)添加到manifest的Assets里。虽然按照正常流程创建的VsPackage会自动加进去的。不过这种正常流程创建的项目默认会启用签名,这会导致你无法引用第三方的没签名的程序集。你可以在项目属性里把启用签名去掉。

添加评论

Loading