c#动态编译

本文摘抄自 http://www.cnblogs.com/jailu/archive/2007/07/22/827058.html

为加深记忆,自己整理代码。

还有个winform的代码链接,没有仔细研究。http://blog.csdn.net/bdmh/article/details/22398077

using System;
using System.Reflection;
using System.Globalization;
using Microsoft.CSharp;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Text; 

namespace DongTaiClass
{
    class Program
    {
        static void Main(string[] args)
        {

            // 1.CSharpCodePrivoder
            CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();

            // 2.ICodeComplier
            //ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();已过时,不用获取ICodeCompiler接口,直接使用objCSharpCodePrivoder

            #region 编译参数
            // 3.CompilerParameters
            //定义编译参数
            CompilerParameters objCompilerParameters = new CompilerParameters();
            //引用的程序集(在此添加)
            objCompilerParameters.ReferencedAssemblies.Add("System.dll");
            //如果要添加相对位置dll可这样添加
            //string path = "";
            //try
            //{
            //    path = AppDomain.CurrentDomain.BaseDirectory + "bin\\";
            //}
            //catch { }
            //objCompilerParameters.ReferencedAssemblies.Add(path + "Penseesoft.Bonus.BLL.dll");

            //是否生成exe程序 true:生成exe文件,则代码中要有静态的main方法
            //                false:生成dll文件
            objCompilerParameters.GenerateExecutable = false;
            //生成结果保存方式 true:在内存中生成
            //                 false:需要指定具体的地址 objCompilerParameters.OutputAssembly= "e:\\a.dll";
            objCompilerParameters.GenerateInMemory = true;

            #endregion 编译参数

            // 4.CompilerResults 编译文本代码
            CompilerResults cr = objCSharpCodePrivoder.CompileAssemblyFromSource(objCompilerParameters, new string[] { GenerateCode() });
            if (cr.Errors.HasErrors)
            {
                Console.WriteLine("编译错误:");
                foreach (CompilerError err in cr.Errors)
                {
                    Console.WriteLine(err.ErrorText);
                }
            }
            else
            {
                // 通过反射,调用HelloWorld的实例
                Assembly objAssembly = cr.CompiledAssembly;
                object objHelloWorld = objAssembly.CreateInstance("DongTaiClass.HelloWorld"); //相当于 HelloWorld objHelloWorld = new HelloWorld()
                //调用OutPut方法,参数为null,返回 return \"Hello world!\";
                MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");
                Console.WriteLine(objMI.Invoke(objHelloWorld, null));
                //调用jisuan方法,参数为1,2,返回 1+2=3
                MethodInfo objJS = objHelloWorld.GetType().GetMethod("jisuan");
                Console.WriteLine(objJS.Invoke(objHelloWorld, new object[] { 1, 2 }));

                //这里不推荐使用构造函数,可以调用某个方法来初始化数据
                //这里可以直接使用objHelloWorld实例
            }

            Console.ReadLine();
        }

        static string GenerateCode()
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("using System;");
            sb.AppendLine("namespace DongTaiClass");
            sb.AppendLine("{");
            sb.AppendLine("    public class HelloWorld");
            sb.AppendLine("    {");
            sb.AppendLine("        public string OutPut()");
            sb.AppendLine("        {");
            sb.AppendLine("             return \"Hello world!\";");
            sb.AppendLine("        }");
            sb.AppendLine("        public int jisuan(int a,int b)");
            sb.AppendLine("        {");
            sb.AppendLine("            return a + b ;");
            sb.AppendLine("        }");
            sb.AppendLine("    }");
            sb.AppendLine("}");

            string code = sb.ToString();
            Console.WriteLine(code);
            Console.WriteLine();

            return code;
        }
    }
}

  上图

时间: 2024-08-06 16:03:40

c#动态编译的相关文章

ANGULARJS 动态编译添加到dom中

在使用angularjs 时,希望通过动态构建angular模版,再通过angular进行展示. 使用 方法如下: <html ng-app="app"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <script src="assets/angular.min.js">

程序动态编译代码

c#可以在程序运行过程中动态的编译代码,并生成程序集加载在内存,然后就可以动态的调用代码生成的程序了,这有点像我们的vs编译器,感兴趣的可以制作属于自己的c#编译器: 要实现这种功能,我们只需要调用CSharpCodeProvider就可以实现了: string prefix = "using System;"+ "public static class Test{"+ "public static void Run(){"; string po

nginx php动态编译加载模块.

#Nginx动态编译加载模块步骤 #查看目前Nginx版本及编译模块 #[[email protected] ~]# /opt/app/lnmp/nginx-1.12.0/sbin/nginx -V #nginx version: nginx/1.12.0 #built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) #built with OpenSSL 1.0.2k  26 Jan 2017 #TLS SNI support enabled #c

浅谈VB.Net 程序的编译和动态编译

---恢复内容开始--- 一般,我们都是通过Visual Studio(下面简称vs)来编写和编译vb.net应用程序的,但是,不少的人并不知道vs是通过何种方式编译程序的.今天,我们就来探讨一下编译vb.net程序的真正原理. 这篇随笔包含如下几个部分: 1.VS是怎么编译的 2.通过vbc.exe来编译应用程序 3.在代码中通过VBCodeProvider动态编译应用程序 ok,首先来说说vs编译应用程序的方法.其实,vs是通过调用vbc.exe来编译vbnet应用程序的.vs把用户编写的代

动态编译添加php模块

注意:转载请注明出处:http://www.programfish.com/blog/?p=85 在很多时候我们用linux里搭建web服务器的时候会需要编译安装php套件,而在编译安装后可能又会需要添加一些编译安装时没有指定要编译进去的模块,例如如下情况: mysql.so 或mysqli.so .mbstring.so  zlib.so 等模块. 这里提示一下: 如果你有安装过phpmyadmin而且在安装配置好之后打开首页是空白的,那么很有可能就是你的php没有mysql和mbstring

Apache静态编译与动态编译区别

静态编译: 在编译时,已经把相关模块编译进httpd二进制文件中不用再 httpd.conf 中在 LoadModule 来加载,只要在  <ifmodule></ifmodule> 中来配置就可以了. 动态编译: 编译的时候,使用 enable-module=shared  或者 enable-modules-shared=module 来动态编译. 动态显然就不编译到httpd里面去了,启动的时候根本不会加载这个模块, 而是给你一个 module.so  文件.你想用,就在ht

动态编译

动态编译.NET代码 分为VB和C#两种 Private Sub BuidSub(OneSource As String, OneRef As String, OneExt As String, OneSub As String, OneClass As String) Dim strSourceCode As String = OneSource Dim objCSharpCodePrivoder As New CSharpCodeProvider() Dim objVBCodePrivode

反射已经&quot;Out&quot;,动态编译才能&quot;Hold&quot;住

Net支持反射功能以后,确实使我们Net程序眼前一亮啊,真是太神奇了,只需要传入字符串就可以完成功能.可以说,反射功能的引入,使我们在处理某些问题上更加得心应手. 传统的Db管理软件中,数据库字段的频繁改动,前台实体类的不断修改,使我们大为头痛.并不是说我们设计的Db结构不合理,而且客户的需求变动十分频繁,而且非常不可控,当然,如果对行业业务非常精通的话,是可以避免这个问题的. 使用反射功能,虽然可以传入字符串来解决某些问题,但如果遇到上述提到的数据库字段增删的问题,我们常用的方法是写入给客户升

gcc 动态编译 动态库路径

gcc 动态编译(共享库) 动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令优点:体积小,编译快缺点:依赖性高 代码如下: [[email protected] shared]# cat add.cint add (int x, int y) {return x + y;} Parsed in 0.007 seconds at 12.13 KB/sadd.c 求和函数 代码如下: [[email protected] shared]# cat print.

java内存动态编译执行

1.package org.jui.core.dynamic; public class DynaCompTest { public static void main(String[] args) throws Exception { String fullName = "DynaClass"; StringBuilder src = new StringBuilder(); src.append("public class DynaClass {\n"); src