简易C#的IDE

五一时去朋友那, 他问了个小问题, 只要写几十行代码就可以很好的说明问题.可偏偏机子没装VS, 只好做罢.回来后想想, 要是有个在线的C#IDE就好了.于是上网查了下相关的资料, 整出来个简单的在线C#IDE.

做这个,主要要解决两个问题, 一是如果将网页上文本框的代码编译并执行;二是如果将程序运行结果在网页上输出.

第一个问题不难, .NET已经有现成的C#编译类CSharpCodeProvider(或是其它语言的),再使用CompilerParameters类做为编译参数,就可以很容易的实现.

第二个问题, 举最简单情况, 就是将Console.Write方法输出的内容在网页上显示出来.这其实也很好办,只要在编译之前, 在输出语句做一个替换, 将输出的内容存到另一个地方.等运行结束后, 再从那个地方取出来就是了.

代码实现如下:

Code

[copy to clipboard]CODE:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace VSOnline.Framework
{
  /**//// <summary>
  /// 自定义的输出类
  /// </summary>
  public class Consoler
  {
    //存储所有输出
    public static Dictionary<string, Consoler> Outputs { get; set; }
    static Consoler()
    {
      Outputs = new Dictionary<string, Consoler>();
    }
    输出操作#region 输出操作
    //当前输出
    public List<string> Output { get; private set; }
    public Consoler()
    {
      Output = new List<string>();
    }
    public void Write(object str)
    {
      Output.Add(str.ToString());
    }
    public void WriteLine(object str)
    {
      Output.Add(str.ToString() + "\n");
    }
    #endregion
  }
}
using System;
using System.Reflection;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace VSOnline.Framework
{
  /**//// <summary>
  /// 代码执行类
  /// </summary>
  public class CodeRun
  {
    /**//// <summary>
    /// Framework版本,可选择v2.0, v3.0, v3.5
    /// </summary>
    private string CompilerVersion { get; set; }
    /**//// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="compilerVersion">Framework版本,可选择v2.0, v3.0, v3.5</param>
    public CodeRun(string compilerVersion)
    {
      CompilerVersion = compilerVersion;
    }
    /**//// <summary>
    /// 构造函数,默认为3.5版本
    /// </summary>
    public CodeRun()
    {
      CompilerVersion = "v3.5";
    }
    /**//// <summary>
    /// 动态编译并执行代码
    /// </summary>
    /// <param name="code">代码</param>
    /// <returns>返回输出内容</returns>
    public List<string> Run(string code, string id, params string[] assemblies)
    {
      Consoler.Outputs.Add(id, new Consoler());
      CompilerParameters compilerParams = new CompilerParameters();
      //编译器选项设置
      compilerParams.CompilerOptions = "/target:library /optimize";
      //compilerParams.CompilerOptions += @" /lib:""C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\""";
      //编译时在内存输出
      compilerParams.GenerateInMemory = true;
      //生成调试信息
      compilerParams.IncludeDebugInformation = false;
      //添加相关的引用
      foreach (string assembly in assemblies)
      {
        compilerParams.ReferencedAssemblies.Add(assembly);
      }
      compilerParams.ReferencedAssemblies.Add("mscorlib.dll");
      compilerParams.ReferencedAssemblies.Add("System.dll");
      if (this.CompilerVersion == "v3.5")
      {
        compilerParams.ReferencedAssemblies.Add("System.Core.dll");
      }
      string path = "";
      try
      {
        path = HttpContext.Current.Server.MapPath("/bin/");
      }
      catch { }
      compilerParams.ReferencedAssemblies.Add(path + "VSOnline.Framework.dll");
      CSharpCodeProvider compiler = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", CompilerVersion } });
      //编译
      code = code.Replace("Console.WriteLine", string.Format("VSOnline.Framework.Consoler.Outputs[\"{0}\"].WriteLine", id));
      code = code.Replace("Console.Write", string.Format("VSOnline.Framework.Consoler.Outputs[\"{0}\"].Write", id));
      CompilerResults results = compiler.CompileAssemblyFromSource(compilerParams, code);
      //错误
      if (results.Errors.HasErrors)
      {
        foreach (CompilerError error in results.Errors)
        {
          Consoler.Outputs[id].Output.Add(error.ErrorText + "\n");
        }
        return ReturnOutput(id);
      }
      //创建程序集
      Assembly asm = results.CompiledAssembly;
      //获取编译后的类型
      object mainClass = asm.CreateInstance("Program");
      Type mainClassType = mainClass.GetType();
      //输出结果
      mainClassType.GetMethod("Main").Invoke(mainClass, null);
      return ReturnOutput(id);
    }
    private List<string> ReturnOutput(string id)
    {
      string[] output = new string[Consoler.Outputs[id].Output.Count];
      Consoler.Outputs[id].Output.CopyTo(output, 0);
      Consoler.Outputs.Remove(id);
      return output.ToList();
    }
  }
}

时间: 2024-07-30 16:59:53

简易C#的IDE的相关文章

定制Eclipse IDE之插件篇(一)

上文回顾:定制Eclipse IDE之功能篇(二) 在这篇文章中,我会将我定制eclipse用到的其他插件罗列出来. 一.汉化插件 Eclipse本身是英文显示的,我们能够通过插件汉化.  1. 选择对应的Eclipse版本. 下载地址:http://www.eclipse.org/babel/downloads.php 2. 选择需要下载的语言   3.解压后直接拷贝到Eclipse的dropins目录即可.   二.打开文件夹位置插件 点击工程或工程文件时候,可以直接打开目录位置. 下载地址

手把手教你将Vim改装成一个IDE编程环境(图文) 吴垠_相关技巧

By: 吴垠 Date: 2007-09-07 Version: 0.5 Email: lazy.fox.wu#gmail.com Homepage: http://blog.csdn.net/wooin Copyright: 该文章版权由吴垠和他可爱的老婆小包子所有.可在非商业目的下任意传播和复制.对于商业目的下对本文的任何行为需经作者同意. 联系方式:lazy.fox.wu#gmail.com 1 写在前面  Linux下编程一直被诟病的一点是: 没有一个好用的IDE, 但是听说Linux牛

Android学习项目之简易版微信为例(一)_Android

这是"Android学习之路"系列文章的开篇,可能会让大家有些失望--这篇文章中我们不介绍简易版微信的实现(不过不是标题党哦,我会在后续文章中一步步实现这个应用程序的).这里主要是和广大朋友们聊聊一个非Java程序员对Android操作系统的理解以及一个Android工程的目录结构,为进一步学习做准备. 1 缘起 智能手机的出现与普及为人们的生活.工作带来了极大的便利,我们可以用手机随时随地.随心所欲地购物.玩游戏.聊天.听音乐等等.一个个精心设计.体验良好的移动客户端应用,让用户们爱

简易的微信公众号管理平台使用指南

简易的微信公众号管理平台使用指南 前言 1.微信功能实现与管理后台目前是独立的. 2.微信功能实现是基于Jfianl-weixin SDK开发的. 3.管理后台使用的Eova开源框架,如果你不喜欢eova框架可以自行处理后台 4.使用时注意公众号接口的权限[公众号接口权限说明] 如果你对微信开发不是很熟悉可以参考我之前写的博客[微信开发专栏] 如果你对微信支付以及支付宝支付感兴趣可以看看我的开源项目 [Android 微信.支付App支付SDK][IJPay 让支付触手可及,实现微信.支付宝系列

Android学习项目之简易版微信为例(一)

这是"Android学习之路"系列文章的开篇,可能会让大家有些失望--这篇文章中我们不介绍简易版微信的实现(不过不是标题党哦,我会在后续文章中一步步实现这个应用程序的).这里主要是和广大朋友们聊聊一个非Java程序员对Android操作系统的理解以及一个Android工程的目录结构,为进一步学习做准备. 1 缘起 智能手机的出现与普及为人们的生活.工作带来了极大的便利,我们可以用手机随时随地.随心所欲地购物.玩游戏.聊天.听音乐等等.一个个精心设计.体验良好的移动客户端应用,让用户们爱

在Java ME平台中使用Subversion、NetBeans IDE和Sun Java System Web Server

问题 源代码管理(SCM)产品用于管理多个版本的项目文件,允许您保存新版本.恢复较旧版本以及在不同版本之间进行比较.当您在修改项目的过程中引入了bug,这将是一个非常有价值的功能.大多数较新源代码管理(SCM)产品除了可管理各文件的版本之外,还提供了在 Bell 实验室中开发的源代码控制系统(SCCS). 即使对于小型项目,每一位开发人员也应该使用源代码管理(SCM).小型项目转变成大型项目是必然的事情,虽然从工作上说仅仅需要修复错误和添加功能.跟踪和管理软件的能力是获得成功的关键因素. 应用程

简易Java爬虫制作

一.文章来由 本来最近任务挺多,但是今天想放松一下,正巧Bill喜欢玩英语配音,而配音都是在配音软件的云上,我想把那些都拿到,于是就写一了一个爬虫,接着就有了这篇爬虫教程~~ 二.爬虫!!爬虫!! 首先要搞清什么叫爬虫~~ 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫. 当然Java本身应该不算是脚本语言(一个脚本通常是解释运行而非编译,J

Oracle客户端简易配置

1.从 ORACLE 下载客户端的简易包,加压缩到磁盘上的任意目录,例如 E: \Utility\Oracle\Win32 2.将该路径增加到系统环境变量 PATH 中,然后将下面的注册表文件导入到注册表中 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE] "NLS_LANG"="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"

安卓录像机-安卓简易录像机如何用代码实现

问题描述 安卓简易录像机如何用代码实现 有哪位大神知道安卓简易录像机如何实现啊 最好有代码和注释 跪求 解决方案 http://blog.csdn.net/shen332401890/article/details/8819564 解决方案二: http://blog.csdn.net/dany1202/article/details/6164450 解决方案三: Android拍照.录像.录音代码范例 android源码解析 ---- camera 照相机 摄像机 解决方案四: http://