zoukankan      html  css  js  c++  java
  • 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则为自定义方法返回值。
  • 相关阅读:
    字在线中
    关于页面显示层叠问题
    左边竖条
    jquery 动态添加元素事件绑定问题
    工作总结
    多文本输入,内容过多时输入框会自动撑开
    lunix常用命令
    springboot整合es availableProcessors is already set to [2], rejecting [2]
    mysql 主从复制架构
    elastic search 第一次安装 报错记录
  • 原文地址:https://www.cnblogs.com/swtool/p/7053104.html
Copyright © 2011-2022 走看看