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则为自定义方法返回值。
  • 相关阅读:
    METHODS OF AND APPARATUS FOR USING TEXTURES IN GRAPHICS PROCESSING SYSTEMS
    Display controller
    Graphics processing architecture employing a unified shader
    Graphics-Processing Architecture Based on Approximate Rendering
    Architectures for concurrent graphics processing operations
    Procedural graphics architectures and techniques
    DYNAMIC CONTEXT SWITCHING BETWEEN ARCHITECTURALLY DISTINCT GRAPHICS PROCESSORS
    Thermal zone monitoring in an electronic device
    System and method for dynamically adjusting to CPU performance changes
    Framework for Graphics Animation and Compositing Operations
  • 原文地址:https://www.cnblogs.com/swtool/p/7053104.html
Copyright © 2011-2022 走看看