.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.Test
- using 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);
- }
- }
- else
- Console.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 看着舒服啊.
来源: https://www.cnblogs.com/xiaotie/p/9607923.html