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则为自定义方法返回值。

原文地址:https://www.cnblogs.com/ellanjianx/p/3685949.html