执行动态CS代码的方法

2014-11-10 00:15:08  访问(2242) 赞(0) 踩(0)

  • 
            /// <summary>
            /// 获得默认的DLL引用
            /// </summary>
            /// <returns></returns>
            public static List<string> GetStaticListDLL()
            {
                List<string> theResult = new List<string>();
    
                theResult.Add("System.dll");
                theResult.Add("System.Web.dll");
                theResult.Add("System.Data.dll");
    
                return theResult;
            }
    
    
            /// <summary>
            /// 动态程序调用
            /// </summary>
            /// <param name="code"></param>
            /// <param name="listDLL"></param>
            /// <param name="createInstanceName"></param>
            /// <param name="methodName"></param>
            /// <param name="IsStaticMethod"></param>
            /// <param name="p"></param>
            /// <returns></returns>
            public static object Call
                (
                    string code,
                    List<string> listDLL,
                    string createInstanceName,
                    string methodName,
                    bool IsStaticMethod,
                    object[] p
                )
            {
                return Call(code, listDLL, false, true, createInstanceName, methodName, IsStaticMethod, p);
            }
    
            /// <summary>
            /// 动态程序调用
            /// </summary>
            /// <param name="code">CS代码</param>
            /// <param name="listDLL">引入的DLL</param>
            /// <param name="GenerateExecutable">获取或设置一个值,该值指示是否生成可执行文件</param>
            /// <param name="GenerateInMemory">获取或设置一个值,该值指示是否在内存中生成输出</param>
            /// <param name="createInstanceName">类实体</param>
            /// <param name="methodName">方法名</param>
            /// <param name="IsStaticMethod">是否静态方法</param>
            /// <param name="p">参数</param>
            /// <returns></returns>
            public static object Call
                (
                    string code,
                    List<string> listDLL,
                    bool generateExecutable,
                    bool generateInMemory,
                    string createInstanceName,
                    string methodName,
                    bool IsStaticMethod,
                    object[] p
                )
            {
                // 1.CSharpCodePrivoder
                // using Microsoft.CSharp
                CSharpCodeProvider objCSharpCodePrivoder 
                    = 
                    new CSharpCodeProvider();
    
                // 2.ICodeComplier
                // using System.CodeDom.Compiler
                ICodeCompiler objICodeCompiler 
                    = 
                    objCSharpCodePrivoder.CreateCompiler();
    
                // 3.CompilerParameters
                // 
                CompilerParameters objCompilerParameters 
                    = 
                    new CompilerParameters();
    
                if (listDLL != null)
                {
                    foreach (string s in listDLL)
                    {
                        objCompilerParameters.ReferencedAssemblies.Add(s);
                    }
                }
    
    
                // 获取或设置一个值,该值指示是否生成可执行文件。
                objCompilerParameters.GenerateExecutable
                    = 
                    generateExecutable;
    
                // 获取或设置一个值,该值指示是否在内存中生成输出。
                objCompilerParameters.GenerateInMemory 
                    = 
                    generateInMemory;
    
                // 4.CompilerResults
                CompilerResults cr
                    = 
                    objICodeCompiler.CompileAssemblyFromSource
                    (
                        objCompilerParameters, 
                        code
                    );
    
                if (cr.Errors.HasErrors)
                {
                    StringBuilder errorSB = new StringBuilder();
    
                    errorSB.AppendLine("代码:");
                    errorSB.AppendLine(code);
                    errorSB.AppendLine();
                    errorSB.AppendLine("编译错误:");
                     
    
                    foreach (CompilerError err in cr.Errors)
                    {
                        errorSB.AppendLine(err.ErrorText);
                    }
    
                    throw new Exception(errorSB.ToString());
                }
                else
                {
                    // 通过反射,调用的实例
                    Assembly objAssembly 
                        = 
                        cr.CompiledAssembly;
    
                    // 创建
                    object theInstance 
                        = 
                        objAssembly.CreateInstance(createInstanceName);
    
                    // 反射获得方法 //
                    MethodInfo methodItem 
                        = 
                        theInstance.GetType().GetMethod(methodName);
    
                    return methodItem.Invoke(theInstance, p);
                }
            }
    

     

    测试要执行的代码:

    using System;
    
    namespace SlowX.CSharpCodeProviderDemo
    {
        public class Demo
        {
            public static int Add(int one, int two)
            {
                return one + two;
            }
        }
    }
    
    

     

    调用方式(调用 SlowX.CSharpCodeProviderDemo.Demo类里面的Add方法,执行2+5的操作):

    try
            {
                List<string> listDLL = new List<string>();
                listDLL.Add("System.dll");
                object[] p =new object[]{2,5};
    
                lt_Result.Text = Call
                    (
                        GetCode(),
                        listDLL,
                        false,
                        true,
                        "SlowX.CSharpCodeProviderDemo.Demo",
                        "Add",
                        true,
                        p
                    ).ToString();
    
            }
            catch (Exception err)
            {
                lt_Result.Text = "发生异常:" + err.Message;
            }
    
    


标签:执行动态CS代码的方法 

上一条:

下一条:


 

相关评论

评论加载中……
 

发表评论

类型:
内容:
  (Alt+Enter)