亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#動態執行字符串(動態創建代碼)的實例代碼

2020-01-24 03:30:50
字體:
來源:轉載
供稿:網友

復制代碼 代碼如下:

using System;
using System.Data;
using System.Configuration;
using System.Text;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;

namespace EvalGuy
{
    /// <summary>
    /// 本類用來將字符串轉為可執行文本并執行
    /// 從別處復制,勿隨意更改!
    /// </summary>
    public class Evaluator
    {
        #region 構造函數
        /// <summary>
        /// 可執行串的構造函數
        /// </summary>
        /// <param name="items">
        /// 可執行字符串數組
        /// </param>
        public Evaluator(EvaluatorItem[] items)
        {
            ConstructEvaluator(items);        //調用解析字符串構造函數進行解析
        }
        /// <summary>
        /// 可執行串的構造函數
        /// </summary>
        /// <param name="returnType">返回值類型</param>
        /// <param name="expression">執行表達式</param>
        /// <param name="name">執行字符串名稱</param>
        public Evaluator(Type returnType, string expression, string name)
        {
            //創建可執行字符串數組
            EvaluatorItem[] items = { new EvaluatorItem(returnType, expression, name) };
            ConstructEvaluator(items);        //調用解析字符串構造函數進行解析
        }
        /// <summary>
        /// 可執行串的構造函數
        /// </summary>
        /// <param name="item">可執行字符串項</param>
        public Evaluator(EvaluatorItem item)
        {
            EvaluatorItem[] items = { item };//將可執行字符串項轉為可執行字符串項數組
            ConstructEvaluator(items);        //調用解析字符串構造函數進行解析
        }
        /// <summary>
        /// 解析字符串構造函數
        /// </summary>
        /// <param name="items">待解析字符串數組</param>
        private void ConstructEvaluator(EvaluatorItem[] items)
        {
            //創建C#編譯器實例
            ICodeCompiler comp = (new CSharpCodeProvider().CreateCompiler());
            //編譯器的傳入參數
            CompilerParameters cp = new CompilerParameters();

            cp.ReferencedAssemblies.Add("system.dll");                //添加程序集 system.dll 的引用
            cp.ReferencedAssemblies.Add("system.data.dll");            //添加程序集 system.data.dll 的引用
            cp.ReferencedAssemblies.Add("system.xml.dll");            //添加程序集 system.xml.dll 的引用
            cp.GenerateExecutable = false;                            //不生成可執行文件
            cp.GenerateInMemory = true;                                //在內存中運行

            StringBuilder code = new StringBuilder();                //創建代碼串
            /*
             *  添加常見且必須的引用字符串
             */
            code.Append("using System; /n");
            code.Append("using System.Data; /n");
            code.Append("using System.Data.SqlClient; /n");
            code.Append("using System.Data.OleDb; /n");
            code.Append("using System.Xml; /n");

            code.Append("namespace EvalGuy { /n");                    //生成代碼的命名空間為EvalGuy,和本代碼一樣

            code.Append("  public class _Evaluator { /n");            //產生 _Evaluator 類,所有可執行代碼均在此類中運行
            foreach (EvaluatorItem item in items)                //遍歷每一個可執行字符串項
            {
                code.AppendFormat("    public {0} {1}() ",            //添加定義公共函數代碼
                                  item.ReturnType.Name,                //函數返回值為可執行字符串項中定義的返回值類型
                                  item.Name);                        //函數名稱為可執行字符串項中定義的執行字符串名稱
                code.Append("{ ");                                    //添加函數開始括號
                code.AppendFormat("return ({0});", item.Expression);//添加函數體,返回可執行字符串項中定義的表達式的值
                code.Append("}/n");                                    //添加函數結束括號
            }
            code.Append("} }");                                    //添加類結束和命名空間結束括號

            //得到編譯器實例的返回結果
            CompilerResults cr = comp.CompileAssemblyFromSource(cp, code.ToString());

            if (cr.Errors.HasErrors)                            //如果有錯誤
            {
                StringBuilder error = new StringBuilder();            //創建錯誤信息字符串
                error.Append("編譯有錯誤的表達式: ");                //添加錯誤文本
                foreach (CompilerError err in cr.Errors)            //遍歷每一個出現的編譯錯誤
                {
                    error.AppendFormat("{0}/n", err.ErrorText);        //添加進錯誤文本,每個錯誤后換行
                }
                throw new Exception("編譯錯誤: " + error.ToString());//拋出異常
            }
            Assembly a = cr.CompiledAssembly;                        //獲取編譯器實例的程序集
            _Compiled = a.CreateInstance("EvalGuy._Evaluator");        //通過程序集查找并聲明 EvalGuy._Evaluator 的實例
        }
        #endregion

        #region 公有成員
        /// <summary>
        /// 執行字符串并返回整型值
        /// </summary>
        /// <param name="name">執行字符串名稱</param>
        /// <returns>執行結果</returns>
        public int EvaluateInt(string name)
        {
            return (int)Evaluate(name);
        }
        /// <summary>
        /// 執行字符串并返回字符串型值
        /// </summary>
        /// <param name="name">執行字符串名稱</param>
        /// <returns>執行結果</returns>
        public string EvaluateString(string name)
        {
            return (string)Evaluate(name);
        }
        /// <summary>
        /// 執行字符串并返回布爾型值
        /// </summary>
        /// <param name="name">執行字符串名稱</param>
        /// <returns>執行結果</returns>
        public bool EvaluateBool(string name)
        {
            return (bool)Evaluate(name);
        }
        /// <summary>
        /// 執行字符串并返 object 型值
        /// </summary>
        /// <param name="name">執行字符串名稱</param>
        /// <returns>執行結果</returns>
        public object Evaluate(string name)
        {
            MethodInfo mi = _Compiled.GetType().GetMethod(name);//獲取 _Compiled 所屬類型中名稱為 name 的方法的引用
            return mi.Invoke(_Compiled, null);                    //執行 mi 所引用的方法
        }
        #endregion

        #region 靜態成員
        /// <summary>
        /// 執行表達式并返回整型值
        /// </summary>
        /// <param name="code">要執行的表達式</param>
        /// <returns>運算結果</returns>
        static public int EvaluateToInteger(string code)
        {
            Evaluator eval = new Evaluator(typeof(int), code, staticMethodName);//生成 Evaluator 類的對像
            return (int)eval.Evaluate(staticMethodName);                        //執行并返回整型數據
        }
        /// <summary>
        /// 執行表達式并返回字符串型值
        /// </summary>
        /// <param name="code">要執行的表達式</param>
        /// <returns>運算結果</returns>
        static public string EvaluateToString(string code)
        {
            Evaluator eval = new Evaluator(typeof(string), code, staticMethodName);//生成 Evaluator 類的對像
            return (string)eval.Evaluate(staticMethodName);                        //執行并返回字符串型數據
        }
        /// <summary>
        /// 執行表達式并返回布爾型值
        /// </summary>
        /// <param name="code">要執行的表達式</param>
        /// <returns>運算結果</returns>
        static public bool EvaluateToBool(string code)
        {
            Evaluator eval = new Evaluator(typeof(bool), code, staticMethodName);//生成 Evaluator 類的對像
            return (bool)eval.Evaluate(staticMethodName);                        //執行并返回布爾型數據
        }
        /// <summary>
        /// 執行表達式并返回 object 型值
        /// </summary>
        /// <param name="code">要執行的表達式</param>
        /// <returns>運算結果</returns>
        static public object EvaluateToObject(string code)
        {
            Evaluator eval = new Evaluator(typeof(object), code, staticMethodName);//生成 Evaluator 類的對像
            return eval.Evaluate(staticMethodName);                                //執行并返回 object 型數據
        }
        #endregion

        #region 私有成員
        /// <summary>
        /// 靜態方法的執行字符串名稱
        /// </summary>
        private const string staticMethodName = "__foo";
        /// <summary>
        /// 用于動態引用生成的類,執行其內部包含的可執行字符串
        /// </summary>
        object _Compiled = null;
        #endregion
    }
    /// <summary>
    /// 可執行字符串項(即一條可執行字符串)
    /// </summary>
    public class EvaluatorItem
    {
        /// <summary>
        /// 返回值類型
        /// </summary>
        public Type ReturnType;
        /// <summary>
        /// 執行表達式
        /// </summary>
        public string Expression;
        /// <summary>
        /// 執行字符串名稱
        /// </summary>
        public string Name;
        /// <summary>
        /// 可執行字符串項構造函數
        /// </summary>
        /// <param name="returnType">返回值類型</param>
        /// <param name="expression">執行表達式</param>
        /// <param name="name">執行字符串名稱</param>
        public EvaluatorItem(Type returnType, string expression, string name)
        {
            ReturnType = returnType;
            Expression = expression;
            Name = name;
        }
    }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97在线精品国自产拍中文| 国产精品女视频| 欧美激情视频网| 亚洲free嫩bbb| 日本一区二区在线播放| 亚洲欧美制服另类日韩| 中文字幕日韩综合av| 亚洲国产高潮在线观看| 欧美高清激情视频| 在线日韩中文字幕| 狠狠躁夜夜躁人人爽天天天天97| 久久天堂电影网| 亚洲精品视频在线观看视频| 欧美日韩免费看| 精品久久香蕉国产线看观看亚洲| 国产91精品黑色丝袜高跟鞋| 精品视频—区二区三区免费| 成人免费福利在线| 亚洲成人av片在线观看| 91久久在线播放| 97香蕉久久夜色精品国产| 777午夜精品福利在线观看| 久久久久国产视频| 国产精品久久久精品| 日韩有码在线视频| 日韩电影免费观看中文字幕| 亚洲精品www久久久久久广东| 69影院欧美专区视频| 97国产一区二区精品久久呦| 欧美性xxxx极品高清hd直播| 日本免费在线精品| 国产精品福利小视频| 精品视频在线播放| 国产美女久久久| 日韩视频亚洲视频| 亚洲国产欧美一区二区三区久久| 中文字幕国产亚洲2019| 久久99国产精品久久久久久久久| 久久综合伊人77777| 九色精品美女在线| 欧美日韩成人网| 亚洲伊人一本大道中文字幕| 亚洲一区二区三区四区视频| 久久综合久久美利坚合众国| 亚洲精品欧美极品| 韩日精品中文字幕| 欧美精品一本久久男人的天堂| 尤物九九久久国产精品的分类| 亚洲精品美女网站| 一个人www欧美| 136fldh精品导航福利| 欧美日韩日本国产| 日韩精品中文字幕有码专区| 4p变态网欧美系列| 久久久久久12| 久久在线免费观看视频| 欧美专区国产专区| 亚洲欧美另类在线观看| 久久夜色精品国产亚洲aⅴ| 精品国产91乱高清在线观看| 欧美日韩高清区| 992tv在线成人免费观看| 精品国产区一区二区三区在线观看| 亚洲精品欧美极品| 91网在线免费观看| 在线国产精品播放| 91成人在线视频| 欧美性xxxxx极品娇小| 欧美激情按摩在线| 国产精品视频精品| 91精品国产777在线观看| 青草热久免费精品视频| 国产一区二区三区在线免费观看| 色777狠狠综合秋免鲁丝| 亚洲国产精品va在线观看黑人| 91社影院在线观看| 欧美午夜精品久久久久久人妖| 国产成人精品免高潮在线观看| 国产欧美精品一区二区| 亚洲国产精彩中文乱码av在线播放| 久久久女人电视剧免费播放下载| 91热福利电影| 日韩av免费在线看| 久久国产精品网站| 欧美一级大片在线观看| 中文字幕亚洲天堂| 亚洲iv一区二区三区| 欧美激情一区二区三区久久久| 欧美日韩xxx| 久热99视频在线观看| 欧美黄网免费在线观看| 日韩欧美成人区| 97视频在线免费观看| 中文字幕日韩精品在线| 韩国一区二区电影| 伊人一区二区三区久久精品| 成人免费网站在线看| 久久久久免费精品国产| 在线电影欧美日韩一区二区私密| 国产在线精品自拍| 亚洲人成网站色ww在线| 日韩精品中文字幕在线观看| 97国产精品久久| 亚洲大胆美女视频| 久久99热这里只有精品国产| 国产精品视频男人的天堂| 亚洲一区二区三区sesese| 亚洲精品videossex少妇| 成人黄色av网| 欧美激情中文字幕乱码免费| 亚洲男人天堂九九视频| 97超级碰碰人国产在线观看| 亚洲第一视频在线观看| 欧美高清电影在线看| 国产欧美久久久久久| 亚洲石原莉奈一区二区在线观看| 亚洲精品少妇网址| 精品国产乱码久久久久久天美| 国产精品视频永久免费播放| 成人国产精品一区二区| 欧美电影第一页| 国语自产精品视频在线看抢先版图片| 亚洲影视九九影院在线观看| 色综合91久久精品中文字幕| 91精品国产综合久久久久久久久| 亚洲精品wwww| 中文字幕亚洲激情| 亚洲sss综合天堂久久| 欧美国产精品日韩| 国产中文字幕日韩| 中文字幕日韩有码| 欧美日韩激情视频| 精品一区二区三区四区| 欧美午夜片在线免费观看| 精品国模在线视频| 日韩av电影在线播放| 国产精品亚洲第一区| 97色在线视频观看| 亚洲欧洲视频在线| 亚洲97在线观看| 黄网站色欧美视频| 一区二区欧美久久| 中文字幕日韩高清| 九九热这里只有精品免费看| 国产欧美精品在线| 欧美激情一区二区三区成人| 精品久久香蕉国产线看观看亚洲| 揄拍成人国产精品视频| 91高清免费视频| 在线精品播放av| 超碰精品一区二区三区乱码| 性欧美xxxx视频在线观看| 中文字幕最新精品| 亚洲精品久久久久久久久| 欧美精品精品精品精品免费| 欧美亚洲国产精品| 2019中文在线观看| 久久久久久亚洲精品不卡| 欧美成aaa人片免费看| 中文在线资源观看视频网站免费不卡| 欧洲精品在线视频| 日本伊人精品一区二区三区介绍| 久久久久久久一区二区三区| 国产美女被下药99|