【xiaosonl】一個極其簡單的線上C#IDE例子
線上C#IDE.
做這個,主要要解決兩個問題, 一是如果將網頁上文字框的程式碼編譯並執行;二是如果將程式執行結果在網頁上輸出.
第一個問題不難, .NET已經有現成的C#編譯類CSharpCodeProvider(或是其它語言的),再使用CompilerParameters類做為編譯引數,就可以很容易的實現.
第二個問題, 舉最簡單情況, 就是將Console.Write方法輸出的內容在網頁上顯示出來.這其實也很好辦,只要在編譯之前, 在輸出語句做一個替換, 將輸出的內容存到另一個地方.等執行結束後, 再從那個地方取出來就是了.
程式碼實現如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace VSOnline.Framework
{
/**////
/// 自定義的輸出類
///
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.Collections.Generic;
using System.Linq;
using System.Text;
namespace VSOnline.Framework
{
/**////
/// 自定義的輸出類
///
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
{
/**////
/// 程式碼執行類
///
public class CodeRun
{
/**////
/// Framework版本,可選擇v2.0, v3.0, v3.5
///
private string CompilerVersion { get; set; }
/**////
/// 建構函式
///
/// Framework版本,可選擇v2.0, v3.0, v3.5
public CodeRun(string compilerVersion)
{
CompilerVersion = compilerVersion;
}
/**////
/// 建構函式,預設為3.5版本
///
public CodeRun()
{
CompilerVersion = "v3.5";
}
/**////
/// 動態編譯並執行程式碼
///
/// 程式碼
/// 返回輸出內容
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>()
using System.Reflection;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace VSOnline.Framework
{
/**////
/// 程式碼執行類
///
public class CodeRun
{
/**////
/// Framework版本,可選擇v2.0, v3.0, v3.5
///
private string CompilerVersion { get; set; }
/**////
/// 建構函式
///
/// Framework版本,可選擇v2.0, v3.0, v3.5
public CodeRun(string compilerVersion)
{
CompilerVersion = compilerVersion;
}
/**////
/// 建構函式,預設為3.5版本
///
public CodeRun()
{
CompilerVersion = "v3.5";
}
/**////
/// 動態編譯並執行程式碼
///
/// 程式碼
///
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>()
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-343230/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 擼一個簡單的MVVM例子MVVM
- 一個最簡單的 Github workflow 例子Github
- 一個簡單的觀察者模式例子模式
- 一個簡單的Ajax請求例子
- JUnit概述及一個簡單例子單例
- 極其簡單的Flutter 螢幕適配Flutter
- WebRTC:一個視訊聊天的簡單例子Web單例
- 一個簡單的例子教會您使用javapJava
- 一個簡單的spring-boot例子Springboot
- 一個簡單的例子帶你理解HashmapHashMap
- 一個閉包函式的簡單例子函式單例
- spring攔截器的一個簡單例子Spring單例
- Java多型的一個簡單入門的例子Java多型
- Spring-Context之一:一個簡單的例子SpringContext
- 《硬碟清道夫》的序號產生器 一個極其簡單的軟體! (649字)硬碟
- php mysql 一個查詢優化的簡單例子PHPMySql優化單例
- linux c 一個autotools的最簡單例子Linux單例
- 一個簡單的oracle函式返回陣列的例子Oracle函式陣列
- 一個關於SQL隱碼攻擊的簡單例子SQL單例
- Unity如何連線伺服器: 一個簡單的例子Unity伺服器
- C++ Boost 之Python(一個簡單的例子) (轉)C++Python
- 一個極簡的RePluginPlugin
- 軟體開發中的矛盾——一個簡單的例子 (轉)
- 極其精簡的PHP框架WJWPHP框架
- XPATH的簡單例子單例
- SAP MM採購定價過程的一個簡單例子單例
- 一個簡單例子教會你C++動態庫的用法單例C++
- 通過一個簡單的例子,瞭解 Cypress 的執行原理
- 用java實現一個簡單的序列化的例子(轉)Java
- 用java實現一個簡單的序列化的例子 (轉)Java
- spring 簡單的使用 Hikari連線池 和 jdbc連線mysql 的一個簡單例子SpringJDBCMySql單例
- 關於Java的RMI程式設計的一個簡單的例子 (轉)Java程式設計
- Websocket簡單例子Web單例
- JNI 簡單例子單例
- HttpClient 簡單例子HTTPclient單例
- TensorFlow 的簡單例子單例
- SAP人工智慧服務Recast.AI的一個簡單例子人工智慧ASTAI單例
- python+flask 編寫一個簡單的登入介面例子PythonFlask