zoukankan      html  css  js  c++  java
  • 自己动手,打造轻量级VSCode/C#环境代替LinqPad

    .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 看着舒服啊。

  • 相关阅读:
    Markdown基本语法
    面向对象
    LeetCode739 每日温度
    LeetCode155 最小栈
    LeetCode279 完全平方数
    LeetCode752 打开转盘锁
    LeetCode622 设计循环队列
    LeetCode200 岛屿的个数
    LeetCode61 旋转链表
    LeetCode138 复制带随机指针的链表
  • 原文地址:https://www.cnblogs.com/xiaotie/p/9607923.html
Copyright © 2011-2022 走看看