zoukankan      html  css  js  c++  java
  • C# 动态编译并调用执行。

    编译+执行代码如下

    //using System;
    
    //namespace DynamicCode
    //{
    //    class Program
    //    {
    //        static void Main(string[] args)
    //        {
    //            Console.WriteLine("Hello World!");
    //        }
    //    }
    //}
    
    using System;
    using System.Collections.Generic;
    //using System.Windows.Forms;
    using System.Threading.Tasks;
    
    using System.IO;
    using System.Reflection;
    using System.Text;
    using System.CodeDom.Compiler;
    using Microsoft.CSharp;
    using static System.Net.Mime.MediaTypeNames;
    
    namespace Excuter
    {
        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main(string[] args)
            {
                //Application.EnableVisualStyles();
                //Application.SetCompatibleTextRenderingDefault(false);
                //Application.Run(new Form1());
    
                if (args == null || args.Length == 0) args = new string[] { @"D:\coding\JahwaPLM\test.cs" };
                if (args != null && args.Length > 0)
                {
                    // 其他参数作为执行参数
                    string[] Arg = null;
                    if (args.Length > 1)
                    {
                        Arg = new string[args.Length - 1];
                        for (int i = 1; i < args.Length; i++)
                        {
                            Arg[i - 1] = args[i];
                        }
                    }
    
                    // 第一个参数作为源码或源码文件
                    if (File.Exists(args[0])) Excute.RunFileFirst(args[0], Arg);
                    else Excute.RunSourceCodeFirst(args[0], Arg);
                }
    
            }
        }
    
        /// <summary>
        /// 动态编译执行
        /// </summary>
        public class Excute
        {
    
            #region 动态编译源码并执行
    
            /// <summary>
            /// 解析并编译执行源码文件sourceFile,第一个类的首个公用或静态方法
            /// </summary>
            public static object RunFileFirst(string sourceFile, object[] args = null)
            {
                try
                {
                    string sourceCode = fileToString(sourceFile);
                    return RunSourceCodeFirst(sourceCode, args);
                }
                catch (Exception ex)
                {
                    return ex.ToString();
                }
            }
    
            /// <summary>
            /// 解析并编译执行sourceCode,第一个类的首个公用或静态方法
            /// </summary>
            public static object RunSourceCodeFirst(string sourceCode, object[] args = null)
            {
                try
                {
                    string[] assemblies = getUsing(sourceCode).ToArray();           // 获取引用程序集
                    string methodName = getFirstPublicMethod(sourceCode);           // 获取方法名
                    bool isStatic = isPublicStaticMethod(sourceCode, methodName);   // 判断是否为静态方法
    
                    return Run(sourceCode, "", methodName, args, isStatic, assemblies);    // 执行
                }
                catch (Exception ex)
                {
                    return ex.ToString();
                }
            }
    
    
            /// <summary>
            /// 动态编译执行
            /// </summary>
            /// <param name="sourceCode">源码</param>
            /// <param name="classFullName">命名空间.类</param>
            /// <param name="methodName">方法名</param>
            /// <param name="args">方法参数</param>
            /// <param name="assemblies">引用程序集</param>
            /// <param name="isStaticMethod">是否为静态方法</param>
            static object Run(string sourceCode, string classFullName, string methodName, object[] args = null, bool isStaticMethod = false, string[] assemblies = null)
            {
                try
                {
                    // 设置编译参数 System.Xml.dll
                    CompilerParameters param = new CompilerParameters();
                    param.GenerateExecutable = false;
                    param.GenerateInMemory = true;
    
                    // 添加常用的默认程序集
                    param.ReferencedAssemblies.Add("Microsoft.CSharp.dll");
                    param.ReferencedAssemblies.Add("mscorlib.dll");
                    param.ReferencedAssemblies.Add("System.dll");
                    param.ReferencedAssemblies.Add("System.Core.dll");
                    param.ReferencedAssemblies.Add("System.Data.dll");
                    param.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll");
                    param.ReferencedAssemblies.Add("System.Drawing.dll");
                    param.ReferencedAssemblies.Add("System.Windows.Forms.dll");
                    param.ReferencedAssemblies.Add("System.Xml.dll");
                    param.ReferencedAssemblies.Add("System.Xml.Linq.dll");
    
                    if (assemblies != null)
                    {
                        foreach (string name in assemblies)
                        {
                            string assembly = name + ".dll";
                            if (!param.ReferencedAssemblies.Contains(assembly))
                            {
                                param.ReferencedAssemblies.Add(assembly);
                            }
                        }
                    }
    
                    // 动态编译字符串代码
                    CompilerResults result = new CSharpCodeProvider().CompileAssemblyFromSource(param, sourceCode);
    
                    if (result.Errors.HasErrors)
                    {
                        // 编译出错:
                        StringBuilder str = new StringBuilder();
                        foreach (CompilerError err in result.Errors)
                        {
                            str.AppendLine(err.ErrorText);
                        }
                        Console.WriteLine(str.ToString());
                        return str.ToString();
                    }
                    else
                    {
                        // 编译通过:
                        Assembly assembly = result.CompiledAssembly;                // 获取已编译通过的程序集
                        if (classFullName == null || classFullName.Equals(""))      // 若未指定,则获取程序集第一个类路径名
                        {
                            classFullName = assembly.GetTypes()[0].FullName;
                        }
    
                        if (isStaticMethod)
                        {
                            // 调用程序集的静态方法: Type.InvokeMember
                            Type type = assembly.GetType(classFullName, true, true);
    
                            //object[] arg = new object[] { "参数1", "参数2" };
                            object tmp = type.InvokeMember(methodName, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, args);
                            return tmp;
                        }
                        else
                        {
                            // 调用程序集类实例方法: method.Invoke
                            object obj = assembly.CreateInstance(classFullName);    // 创建一个类实例对象
                            MethodInfo method = obj.GetType().GetMethod(methodName);// 获取对象的对应方法
    
                            object tmp = method.Invoke(obj, args);                  // 调用对象的方法
                            return tmp;
                        }
                    }
                   
                }
                catch (Exception ex)
                {
                    return ex.ToString();
                }
                Console.WriteLine("RUN OK");
            }
    
            #endregion
    
            #region 相关功能函数
    
            /// <summary>
            /// 获取文件中的数据,自动判定编码格式
            /// </summary>
            private static string fileToString(String filePath)
            {
                string str = "";
    
                //获取文件内容
                if (File.Exists(filePath))
                {
                    StreamReader file1;
    
                    file1 = new StreamReader(filePath, Encoding.UTF8);  // 读取文件中的数据
                    str = file1.ReadToEnd();                            // 读取文件中的全部数据
    
                    file1.Close();
                    file1.Dispose();
                }
                return str;
            }
    
            /// <summary>
            /// 获取第一个公用方法
            /// </summary>
            /// <param name="sourceCode"></param>
            /// <returns></returns>
            private static string getFirstPublicMethod(string sourceCode)
            {
                string methodName = "";
                String[] lines = sourceCode.Replace("\r\n", "\n").Split('\n');
                foreach (string iteam in lines)
                {
                    string line = iteam.Trim();
                    if (line.StartsWith("public ") && line.Contains("(") && line.Contains(")"))
                    {
                        methodName = line.Substring(0, line.IndexOf("("));
                        methodName = methodName.Substring(methodName.LastIndexOf(" ") + 1);
                        break;
                    }
                }
                return methodName;
            }
    
            /// <summary>
            /// 判断指定的方法是否为静态方法
            /// </summary>
            /// <returns></returns>
            private static bool isPublicStaticMethod(string sourceCode, string methodName)
            {
                bool isStatic = false;
                String[] lines = sourceCode.Replace("\r\n", "\n").Split('\n');
                foreach (string iteam in lines)
                {
                    string line = iteam.Trim();
                    if (line.StartsWith("public ") && line.Contains(" " + methodName) && line.Contains("(") && line.Contains(")") && line.Contains("static"))
                    {
                        isStatic = true;
                    }
                }
                return isStatic;
            }
    
            /// <summary>
            /// 获取应用的程序集信息
            /// </summary>
            private static List<string> getUsing(string sourceCode)
            {
                String[] lines = sourceCode.Replace("\r\n", "\n").Split('\n');
                List<string> usings = new List<string>();
                foreach (string iteam in lines)
                {
                    string line = iteam.Trim();
                    if (line.StartsWith("using ") && line.EndsWith(";"))
                    {
                        string usingAssembley = line.TrimEnd(';').Substring("using ".Length);
                        CheckAddAssembly(usings, usingAssembley);
                    }
                }
                return usings;
            }
    
            /// <summary>
            /// 检测添加较短长度的Assembly名称
            /// </summary>
            private static void CheckAddAssembly(List<string> usings, string usingAssembley)
            {
                if (usings.Contains(usingAssembley)) return;
                for (int i = 0; i < usings.Count; i++)
                {
                    string name = usings[i];
                    if (usingAssembley.StartsWith(name + ".")) return;
                    else if (name.StartsWith(usingAssembley + "."))
                    {
                        usings[i] = usingAssembley;
                    }
                }
                usings.Add(usingAssembley);
            }
    
            #endregion
    
        }
    }

    测试代码 将需的第三方库copy到执行器目录Newtonsoft.Json

    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.SqlClient;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Excuter
    {
       public class pp
        {
           public static void run()
            {
    
                Task.Run(()=>{
    
                    Console.WriteLine("-----run ok");
                    //var b = SqlHelper.GetProjectType(11);
                    //Console.WriteLine(JsonConvert.SerializeObject(b));
                });
                Console.WriteLine("-----");
                //var a = SqlHelper.GetProjectType(11);
                //Console.WriteLine(JsonConvert.SerializeObject(a));
                Console.ReadKey();
    
            }
        }
        
        
        public class SqlHelper
        {
            public static string ConnString = @"data source=172.24.106.66;initial catalog=DXCCosmetics310;user id=sa;password=123456;max pool size=200;Pooling=true;";
            //ConfigurationManager.ConnectionStrings["sql"].ConnectionString;
            // @"server=6;uid=sa;pwd=;database=;";//
            //初始化SqlCommand对象
            public static void InitializeCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, params SqlParameter[] paras)
            {
                if (conn.State != ConnectionState.Open)
                    conn.Open();
                cmd.Connection = conn;
                cmd.CommandText = cmdText;
                if (trans != null)
                    cmd.Transaction = trans;
                cmd.CommandType = cmdType;
                if (paras != null)
                    foreach (SqlParameter item in paras)
                    {
                        cmd.Parameters.Add(item);
                    }
            }
    
            //查询数据,返回相应的数据表
            public static DataTable GetDataTable(string connString, CommandType cmdType, string cmdText, params SqlParameter[] paras)
            {
                SqlCommand cmd = new SqlCommand();
                using (SqlConnection conn = new SqlConnection(connString))
                {
                    InitializeCommand(cmd, conn, null, cmdType, cmdText, paras);
                    using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
                    {
                        DataTable dt = new DataTable();
                        adapter.Fill(dt);
                        cmd.Parameters.Clear();
                        return dt;
                    }
                }
            }
    
            //查询单个数据,返回第一列第一行的数据
            public static object ExecuteScalar(string connString, CommandType cmdType, string cmdText, params SqlParameter[] paras)
            {
                SqlCommand cmd = new SqlCommand();
                using (SqlConnection conn = new SqlConnection(connString))
                {
                    InitializeCommand(cmd, conn, null, cmdType, cmdText, paras);
                    object obj = cmd.ExecuteScalar();
                    cmd.Parameters.Clear();
                    return obj;
                }
            }
    
            public static object GetProjectType(int projectCode)
            {
                //首先定义用于查询的SQL脚本
                string cmdText = @"SELECT top 10 * FROM ;";
                //使用SqlHelper操作类来读取表数据
                //定义一个用于存储读取过来的表数据DataTable对象
                try
                {
                    DataTable dt = SqlHelper.GetDataTable(SqlHelper.ConnString, CommandType.Text, cmdText);
    
                    return dt;
                    //var dt = SqlHelper.ExecuteScalar(SqlHelper.ConnString, CommandType.Text, cmdText);
                    //return dt;
                }
                catch (Exception ex)
                {
    
                    LogHelper.Debug(JsonConvert.SerializeObject(ex));
                }
                return null;
            }
        }
        /// <summary>
        /// 打印Log
        /// </summary>
        public class LogHelper
        {
            static bool LogOff = false;
            public static string GetDirPath()
            {
                var Dic = AppDomain.CurrentDomain.BaseDirectory.Split('\\').ToList();
                if (Dic.Count <= 3)
                {
                    return AppDomain.CurrentDomain.BaseDirectory + "\\logs";
                }
                var Dics = Dic.Take(Dic.Count - 3).ToArray();
                string path = string.Join("\\", Dics) + "\\logs";
                return path;
            }
    
            //在网站根目录下创建日志目录(bin文件夹→debug文件夹→logs文件夹)
            public static string path = GetDirPath();// @"..\..\logs\";// 
    
            //死锁
            public static object loglock = new object();
    
            public static void Debug(string content)
            {
                WriteLog("DEBUG", content);
            }
    
            public static void Info(string content)
            {
                WriteLog("INFO", content);
            }
    
            public static void Error(string content)
            {
                WriteLog("ERROR", content);
            }
    
            protected static void WriteLog(string type, string content)
            {
                if (LogOff)
                {
                    return;
                }
    
                lock (loglock)
                {
                    if (!Directory.Exists(path))//如果日志目录不存在就创建
                    {
                        Directory.CreateDirectory(path);
                    }
    
                    string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff");//获取当前系统时间
                    string filename = path + "/" + DateTime.Now.ToString("yyyy-MM-dd") + ".log";//用日期对日志文件命名
    
                    //创建或打开日志文件,向日志文件末尾追加记录
                    StreamWriter mySw = File.AppendText(filename);
    
                    //向日志文件写入内容
                    string write_content = time + " " + type + ": " + content;
                    mySw.WriteLine(write_content);
    
                    //关闭日志文件
                    mySw.Close();
                }
            }
        }
    
    
    
    }
  • 相关阅读:
    python学习之老男孩python全栈第九期_day015知识点总结
    python学习之老男孩python全栈第九期_第二周学习总结
    python学习之老男孩python全栈第九期_day016作业
    python学习之老男孩python全栈第九期_day014知识点总结
    监听文件输入的例子
    python学习之老男孩python全栈第九期_day013知识点总结
    python学习之老男孩python全栈第九期_day015作业_老男孩Python全9期练习题(面试真题模拟)
    python学习之老男孩python全栈第九期_day014作业
    python学习之老男孩python全栈第九期_day011作业
    python学习之老男孩python全栈第九期_day008作业
  • 原文地址:https://www.cnblogs.com/mrguoguo/p/15598375.html
Copyright © 2011-2022 走看看