最近研究從頁面手動編寫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則為自定義方法返回值。