• C#中自定义方法,动态编译,生成dll文件


    最近研究从页面手动编写C#方法内容,并编译生成dll文件供其他用户调用。在此做出简单总结。

    1.生成cs文件。

       这里可以定义一个cs文件模板,当用户页面输入方法具体内容后,将内容填充到模板中,这里需要注意的是:自定义方法的返回值和传入的参数理论上应该都是objec类型,因为在反射调用的时候,方法允许输入的参数类型也是object的,所以,这里你的方法不管定义的是何种类别的参数,最后传入的都是object,同理,由于反射调用方法时,获取到的方法返回值也同样是object 的,所以我们自定义方法的返回值也应该是object 的,定义成其他格式的返回类型,不会在结果造成任何影响。

    例如下:

    private object   test(object parm)

    {

       var result="";

       //方法具体内容

       return result;

    }

    2.编译并生成dll文件。

    方法定义完后,将方法具体内容插入模板中,并生成编译,如果编译通过,则生成dll文件。编译不通过,获取错误信息。

    如:

            CompilerResults result = DebugRun(整个cs代码, dll保存路径);

            通过判断 result.Errors.Count 是否为0,得出是否编译通过。

            /// <summary>
            /// 动态编译并执行代码
            /// </summary>
            /// <param name="code">代码</param>
            /// <returns>返回输出内容</returns>
            public CompilerResults DebugRun(string code, string newPath)
            {
                ICodeCompiler complier = new CSharpCodeProvider().CreateCompiler();
                //设置编译参数
                CompilerParameters paras = new CompilerParameters();
                //引入第三方dll
                paras.ReferencedAssemblies.Add("System.dll");
           //引入自定义dll
                paras.ReferencedAssemblies.Add(@"D:自定义方法自定义方法inLogHelper.dll");
                //是否内存中生成输出
           paras.GenerateInMemory = false;
         //是否生成可执行文件
                paras.GenerateExecutable = false;
                paras.OutputAssembly = newPath + ".dll";

                //编译代码
                CompilerResults result = complier.CompileAssemblyFromSource(paras, code);

                return result;
            }

    3.调用并验证。

    dll的调用,采用反射方法

                    Assembly assembly = Assembly.LoadFile(dll生成路径);
                    Type AType = assembly.GetType(命名空间);
                    MethodInfo method = AType.GetMethod(方法名称);
                    var t = method.ReturnType.Name;
                    object[] parameters = new object[] { 传入参数};
                    var returnResult = Convert.ToString(method.Invoke(null, parameters));

    returnResult则为自定义方法返回值。

  • 相关阅读:
    集成mybatis(五)
    集成mybatis(四)
    集成mybatis(三)
    集成mybatis(二)
    集成mybatis(一)
    动态代理深入研究
    ==和equals的区别
    ajax写法
    springMVC通过ajax传参到后台
    记录一次 sql在数据库可以查到 mybatis代码查不到的问题
  • 原文地址:https://www.cnblogs.com/ellanjianx/p/3685949.html
Copyright © 2020-2023  润新知