【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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一個簡單的「IOC」例子
- spring 簡單的使用 Hikari連線池 和 jdbc連線mysql 的一個簡單例子SpringJDBCMySql單例
- 擼一個簡單的MVVM例子MVVM
- Unity如何連線伺服器: 一個簡單的例子Unity伺服器
- 一個最簡單的 Github workflow 例子Github
- 一個簡單的netty通訊的例子Netty
- JUnit概述及一個簡單例子單例
- WebRTC:一個視訊聊天的簡單例子Web單例
- 一個簡單的生活例子,感受TRIZ的魅力!
- 極其簡單的Flutter 螢幕適配Flutter
- 一個簡單的例子瞭解async跟defer
- 一個簡單的例子教會您使用javapJava
- 搭建個人圖書館!一個簡單的線上個人書庫
- 高大上的詞雲,其實很簡單
- python+flask 編寫一個簡單的登入介面例子PythonFlask
- python+flask編寫一個簡單的登入介面例子PythonFlask
- SAP MM採購定價過程的一個簡單例子單例
- 一個簡單的例子理解Kubernetes的三種IP地址型別型別
- 通過一個簡單的例子,瞭解 Cypress 的執行原理
- 一個極簡的RePluginPlugin
- IDEA如何線上安裝一個外掛,超簡單Idea
- spring mvc(註解)上傳檔案的簡單例子SpringMVC單例
- SAP人工智慧服務Recast.AI的一個簡單例子人工智慧ASTAI單例
- 一個簡單例子教會你C++動態庫的用法單例C++
- 簡單的整合 shiro + SpringMVC 例子SpringMVC
- 一個極易踩坑的例子,希望大家引以為戒
- 簡單的單例模式其實也不簡單單例模式
- Laravel 關聯查詢 ——一對一 簡單例子Laravel單例
- TypeScript 類裝飾器的一個例子和使用單步除錯搞清楚其執行原理TypeScript除錯
- Matplotlib1.簡單例子單例
- 5 個簡單又好用的免費線上神器,第 2 個真香
- go語言如何入門?從一個簡單例子開始學起Go單例
- 轉一篇OpenSSL的例子:簡單的TLS伺服器TLS伺服器
- 一個極簡版本的 VUE SSR demoVue
- SAP Cloud Platform integration上建立一個最簡單的iFlowCloudPlatform
- 極速、便捷!一個接入 AI 的匿名線上即時聊天室!AI
- EventLoop其實如此簡單OOP
- Promise 其實很簡單Promise
- 介紹一個能開發簡單SAP UI5應用的線上IDE:StackBlitzUIIDE