.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 == )
{
String fileName = args[];
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();
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(, lastIdx);
String methodName = cmd.Substring(lastIdx + );
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 看着舒服啊。

最新文章

  1. Windows Phone 一、XAML基础语法
  2. web前端职业规划(转)
  3. javaWeb之maven多数据库环境的配置信息
  4. python 批量更改文件名
  5. Eclipse下编写的web项目部署到tomcat下
  6. 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取”产品付费数量等于0的问题”】
  7. 2013=11=12 SQL 实验
  8. 如何设置listview每个item高度
  9. EntityFramework中支持BulkInsert扩展
  10. 详解一下网络广告cpc、cpm、cpl、cpa、cps、cpr的计费方法是什么
  11. Arduino使用注意问题及编程相关
  12. AVFoundation(一)---AVAudioPlayer
  13. C++11右值引用和std::move语句实例解析
  14. Jfinal启动原理及源码简析
  15. Vue-自带vue-resource插件实现http请求
  16. python设计模式第八天【装饰器模式】
  17. [转]浅谈Normalize.css
  18. 涂抹mysql笔记-InnoDB/MyISAM及其它各种存储引擎
  19. es 加磁盘扩容
  20. Python3基础 str 通过拆分字符串与插入新的内容形成新的字符串

热门文章

  1. .Net语言 APP开发平台——Smobiler学习日志:如何设置页面的title
  2. @Html.DropDownListFor 下拉框绑定(选择默认值)
  3. 从零开始学安全(三十五)●mysql 盲注手工自定义python脚本
  4. 收集的博客网址springboot、cloud
  5. Java设计模式——适配器模式(Adapter)
  6. 如何给win7自带的截图工具设置快捷键
  7. nginx 防止盗链
  8. Nginx反向代理实现IP访问分流
  9. LeetCode算法题-Heaters(Java实现)
  10. Redis操作集合,有序集合