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則為自定義方法返回值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM