我們在寫JavaScript程式的時候,有一個函式很有趣,eval(),這個方法非常有趣,他可以編譯他內部的字串,并將字串按照JS代碼執行,例如eval(‘alert(“message”)’),執行的結果就是彈窗列印出message這個資訊,如下圖

最近我在用C#寫一個功能的時候的時候也遇到相似的需求,我的要求是自定義一個對字串的驗證代碼,在程式執行的程序中對自定義的代碼進行編譯并執行,最后回傳執行的結果,自定義的驗證代碼可以保存在檔案中,也可以保存到資料庫中,在需要的時候取出驗證的代碼,并執行,
要執行這樣的功能可以有幾種方案可以實作,
方案一、
通過拼接字串的方式,生成一個cs類檔案,再使用反射的方式呼叫此cs檔案即可,此方式最簡單,只需要熟練使用反射的相關知識即可,
方案二、
使用CSharpCodeProvider物件來決議字串并通過反射的方式執行,
上面兩種方案都需要熟練使用反射的技術,方案一相對來說比較簡單,這里主要學習使用方案二來是實作相關功能,
使用方案二需要了解以下幾個類,
CSharpCodeProvider, ICodeCompiler, CompilerParameters, CompilerResults
下面是一個示例程式
//1.創建CSharpCodeProvider的實體
CSharpCodeProvider cs = new CSharpCodeProvider();
//2.創建一個ICodeComplier物件
ICodeCompiler cc = cs.CreateCompiler();
//3.創建一個CompilerParameters的實體
CompilerParameters cp = new CompilerParameters();
cp.GenerateInMemory = true;//設定在記憶體中創建程式集
cp.GenerateExecutable = false;//設定是否創建可執行檔案,也就是exe檔案或者dll檔案
cp.ReferencedAssemblies.Add("System.dll");//此處代碼是添加對應dll檔案的參考
cp.ReferencedAssemblies.Add("System.Core.dll");//System.Linq存在于System.Core.dll檔案中
//4.創建CompilerResults的實體
string strExpre= "using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace DynamicCompileTest{public class TestClass1{public bool CheckBool(string source){ return source.Contains(\"SC\"); }}}";
CompilerResults cr = cc.CompileAssemblyFromSource(cp, strExpre);
if (cr.Errors.HasErrors)
{
Console.WriteLine(cr.Errors.ToString());
}
else
{
//5.創建一個Assembly物件
Assembly ass = cr.CompiledAssembly;//動態編譯程式集
object obj = ass.CreateInstance("DynamicCompileTest.TestClass1");
MethodInfo mi = obj.GetType().GetMethod("CheckBool");
bool result = (bool)mi.Invoke(obj, new object[] { "LYF" });
}
Console.ReadKey();
總體來說,兩個方案都是通過拼接字串最后形成可執行的代碼來實作的,與我們平時在VS中寫代碼的方式相同,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/122540.html
標籤:C#
