.Net 的項目都挺重的,一直想找一個輕量級的 CSharp 環境,能像Python那樣,選一個文件就能跑的。以前用的是 LinqPad,但它的缺點也很明顯:算法
(1) 不付費,自動完成不能用(好吧,俺購買了);json
(2) 醜!(這個不能忍受!醜影響心情,做爲一位靠靈感吃飯的算法開發人員,能忍受貴,不能忍受醜!)spa
因而本身動手,把VSCode改爲了輕量級 CSharp 環境。 3d
(1) 創建一個目錄,好比,VSCodeTest,進入該目錄,dotnet new console 建立項目;調試
(2) 用VSCode打開目錄,調試下程序,這時,目錄下自動生成了 launch.json 文件,修改文件,將code
"args": []
改成blog
"args": ["${file}"]
這樣,當執行程序時,會自動將當前打開文件的路徑傳給 Main 方法。ip
(3) 創建Scripts目錄,創建Foo.cs 文件,內容以下:開發
//RUN: VSCodeTest.Foo.Test using System; namespace VSCodeTest { class Foo { public static void Test() { Console.WriteLine("Test Run Script"); } } }
文件裏,第一行 //RUN: 後面指定運行的方法名稱cmd
(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 看着舒服啊。