寫這篇筆記的理由是因為上篇g提高的工具LINQPad見
想用LINQ思考嗎?扔掉SQL查詢分析器Come on LINQPad!
該工具的實現就有執行動態代碼的應用
應用場景
還沒想出來會用到哪裡動態的代碼由誰來寫?普通用戶我想有一定的困難
特別是有了像 IronPython 這樣更容易使用的動態嵌入腳本
) 像 LINQPad 這樣的輔助開發工具
) 實現腳本引擎?
) 探討
主要使用命名空間 MicrosoftCSharp 編譯C#代碼然後使用 CodeDom 和 反射調用我這裡寫了一個測試工具看代碼
using System;
using SystemCollectionsGeneric;
using SystemComponentModel;
using SystemDrawing;
using SystemWindowsForms;
using SystemCodeDomCompiler;
using MicrosoftCSharp; // 用於編譯C#代碼
using SystemReflection; // 用於反射調用
namespace CodeDomLearn
{
public partial class Form : Form
{
public Form() {
InitializeComponent();
}
private void button_Click(object sender EventArgs e) {
CodeCompilerCompile(new string[] { } textBoxText );
listBoxItemsClear();
foreach (string s in CodeCompilerErrorMessage) {
listBoxItemsAdd(s);
}
listBoxItemsAdd(CodeCompilerMessage);
}
}
static class CodeCompiler {
static public string Message;
static public List<string> ErrorMessage = new List<string>();
public static bool Compile(string[] references string source string outputfile) {
// 編譯參數
CompilerParameters param = new CompilerParameters(references outputfile true);
paramTreatWarningsAsErrors = false;
paramGenerateExecutable = false;
paramIncludeDebugInformation = true;
// 編譯
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerResults result = providerCompileAssemblyFromSource(param new string[] { source });
Message = ;
ErrorMessageClear();
if (!resultErrorsHasErrors) { // 反射調用
Type t = resultCompiledAssemblyGetType(MyClass);
if (t != null) {
object o = resultCompiledAssemblyCreateInstance(MyClass);
Message = (string)tInvokeMember(GetResult BindingFlagsInstance | BindingFlagsInvokeMethod | BindingFlagsPublic null o null);
}
return true;
}
foreach (CompilerError error in resultErrors) { // 列出編譯錯誤
if (errorIsWarning) continue;
ErrorMessageAdd(Error( + errorErrorNumber + ) + errorErrorText + \t\tLine: + errorLineToString() + Column:+errorColumnToString());
}
return false;
}
}
}
作為演示例子簡單的規定類名必須是MyClass必須有一個方法返回 string 類型的 GetResult 方法這是執行效果圖
From:http://tw.wingwit.com/Article/program/net/201311/12884.html