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:\自定义方法\自定义方法\bin\LogHelper.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则为自定义方法返回值。