最近研究从页面手动编写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则为自定义方法返回值。