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

news/2024/7/3 3:35:40

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

(1)     不付费,自动完成不能用(好吧,俺购买了);

(2)     丑!(这个不能忍受!丑影响心情,作为一位靠灵感吃饭的算法开发人员,能忍受贵,不能忍受丑!)

于是自己动手,把VSCode改成了轻量级 CSharp 环境。 

(1)     建立一个目录,比如,VSCodeTest,进入该目录,dotnet new console 创建项目;

(2)     用VSCode打开目录,调试下程序,这时,目录下自动生成了 launch.json 文件,修改文件,将

"args": [] 

改为

"args": ["${file}"]

这样,当执行程序时,会自动将当前打开文件的路径传给 Main 方法。

(3)     建立Scripts目录,建立Foo.cs 文件,内容如下:

//RUN: VSCodeTest.Foo.Testusing System;namespace VSCodeTest
{class Foo{public static void Test(){Console.WriteLine("Test Run Script");}}
}

文件里,第一行 //RUN: 后面指定运行的方法名称

(4)     修改 Program.cs 如下:

using System;
using System.IO;
using System.Reflection;namespace VSCodeTest
{class Program{static void Main(string[] args){            if(args.Length == 1){String fileName = args[0];if(File.Exists(fileName) == false){Console.WriteLine("文件不存在:" + fileName);return;}var it = File.ReadLines(fileName).GetEnumerator();if(it.MoveNext()){String line = it.Current;line = line.Trim();if(line.StartsWith("//RUN:")){line = line.Substring(6);line = line.Replace(";","");line = line.Trim();Eval(line);}}elseConsole.WriteLine("未指定调用方法: " + fileName);}}static void Eval(String cmd){Console.WriteLine("[Invoke]:" + cmd);int lastIdx = cmd.LastIndexOf('.');String typeName = cmd.Substring(0, lastIdx);String methodName = cmd.Substring(lastIdx + 1);try{var type = Type.GetType(typeName);if (type!= null){var method = type.GetMethod(methodName);if(method != null){method.Invoke(null,null);return;}}Console.WriteLine("未找到调用方法: " + cmd);}catch(Exception ex){Console.WriteLine(ex.Message);}}}
}

这样,当运行时,它会解析指定的方法名称,通过反射来调用它。

就这么就OK了。打开哪个文件,执行的就是该文件中指定的方法。比如,打开 Foo.cs 文件,按 F5 调试或Ctrl+F5 直接执行,可以看见,程序执行的是指定的方法。

优点:

(1)     支持直接执行;

(2)     支持调试;

(3)     支持引用第三方dll,支持文件间的相互引用。

缺点:如果项目里其他文件有编译错误,则会影响当前文件的执行。

----

还是 VSCode 看着舒服啊。

 


http://lihuaxi.xjx100.cn/news/236280.html

相关文章

c语言基础知识pdf下载,C语言主基础知识.pdf

C语言主基础知识泰山学院CSDN 俱乐部C 语言主要基础内容1、预处理命令 预处理的概念:在编译之前进行的处理。预处理命令以符号“#”开头。2 、关于#include 在编译之前将 stdio.h 文件包含入源文件中(include:包含) 即将stdio.h 文件中的内容复制到代码中…

vue - check-versions.js for child_process

webpack之类的配置文件. webpack.base.conf.js

PoPo数据可视化第9期

PoPo数据可视化 聚焦于Web数据可视化与可视化交互领域,发现可视化领域有意思的内容。不想错过可视化领域的精彩内容, 就快快关注吧 :)2018 in the Ito Design Lab(视频内容请关注微信公众号浏览)1900~2018年城市温度异常变化可视化Temperatur…

在c语言中temp的意思,temp

3.新建一个文本文档,在里面写入两行指令:RD %TEMP% /S/QMKDIR %TEMP%然后另外储存为*.bat格式(比如CleanTEMP.bat),这样只要打开一下CleanTEMP.bat档案就自动清空Temp资料夹下的杂碎了。4.经过以上三步,我们其实可以很好的清除那些…

layoutSubviews 调用情况

init初始化不会触发layoutSubviews 但是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero时,也会触发addSubview会触发layoutSubviews设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化滚动一个UIScrollView会触发la…

前端技术选型的遗憾和经验教训

我是Max,Spectrum的技术联合创始人。Spectrum 是一个面向大型在线社区的开源聊天应用程序,最近被GitHub收购。我们是一个三人团队,主要拥有前端和设计背景,我们在这个项目上工作了近两年时间。 事后看来,以下是我做出的…

c语言指针要点,C语言指针的重点有哪些?

指针说难也不难,说不难吧,有点难理解把握几点,就不是很难了1、指针是变量,可以当成一般的变量来操作2、指针可以做减法,不可以做加乘除,减法的意思是求两个内存空间之间隔着几个字节。加乘除没有意义3、内存…

kali linux网络配置

事情是这样的 今天早上想安装一个按个人信息生成密码的软件 发现无法安装 发现问题后 我首先检查了kali有没有获取到IP 然后就是没有获取IP 怎么解决问题如下: 原理进程: 1.写入dhcp服务 1.进行DNS设置 首先输入命令: gedit /etc/network/int…