class Program
{
static void Main(string[] args)
{
Test();
} public static void Test()
{
//声明代码的部分
CodeCompileUnit compunit = new CodeCompileUnit();
CodeNamespace sample = new CodeNamespace("命名空间");
compunit.Namespaces.Add(sample); //引用命名空间
sample.Imports.Add(new CodeNamespaceImport("System"));//导入System命名空间
sample.Imports.Add(new CodeNamespaceImport("System.Linq"));//导入System.Linq命名空间 //在命名空间下添加一个类
CodeTypeDeclaration wrapProxyClass = new CodeTypeDeclaration("类名");
//wrapProxyClass.BaseTypes.Add(baseType);// 如果需要的话 在这里声明继承关系 (基类 , 接口)
wrapProxyClass.CustomAttributes.Add(new CodeAttributeDeclaration("Serializable"));//添加一个Attribute到class上
sample.Types.Add(wrapProxyClass);//把这个类添加到命名空间 ,待会儿才会编译这个类 //为这个类添加一个无参构造函数 其实不添加也没事的, 只是做个demo而已
CodeConstructor constructor = new CodeConstructor();
constructor.Attributes = MemberAttributes.Public;
wrapProxyClass.Members.Add(constructor); //为这个类添加一个方法 public override int 方法名(string str);
System.CodeDom.CodeMemberMethod method = new CodeMemberMethod();
method.Name = "方法名";
method.Attributes = MemberAttributes.Public;//声明方法是公开 并且override的
method.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), "str")); //这个方法添加一个输入参数
method.ReturnType = new CodeTypeReference(typeof(int));//声明返回值的类型
method.Statements.Add(new CodeSnippetStatement(@"
Console.WriteLine(str);
return 1; ")); //方法体里面很简单 直接返回 一个1;
wrapProxyClass.Members.Add(method); CSharpCodeProvider cprovider = new CSharpCodeProvider(); ICodeGenerator gen = cprovider.CreateGenerator();
StringBuilder fileContent = new StringBuilder();
using (StringWriter sw = new StringWriter(fileContent))
{
gen.GenerateCodeFromCompileUnit(compunit, sw, new CodeGeneratorOptions());//想把生成的代码保存为cs文件
} ICodeCompiler compiler = cprovider.CreateCompiler(); //编译参数
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("System.dll");//刚才引用了命名空间 这里是添加引用
cp.ReferencedAssemblies.Add("System.Core.dll");//刚才引用了命名空间 这里是添加引用 cp.OutputAssembly = "输出dll的位置.dll";
cp.GenerateInMemory = false; //是否只在内存中生成
cp.IncludeDebugInformation = true;//包含调试符号 pdb文件
cp.GenerateExecutable = false;//生成dll,不是exe
cp.WarningLevel = ;
cp.TreatWarningsAsErrors = false; string filePath = "生成cs文件的保存位置.cs";
File.WriteAllText(filePath, fileContent.ToString());
CompilerResults cr = compiler.CompileAssemblyFromFile(cp, filePath); //保存文件再进行编译 待会儿调试就比较方便了 ,可以直接断点到刚才生成的文件里面
// CompilerResults cr = compiler.CompileAssemblyFromDom(cp, compunit); //这样的生成 不用写文件 ,就是调试麻烦
String outputMessage = "";
foreach (var item in cr.Output)
{
outputMessage += item + Environment.NewLine;//调试的最终输出信息
}
if (cr.Errors.Count > )//有编译错误就抛出异常
{
throw new Exception("error:" + Environment.NewLine + outputMessage);
} string dllDir = Path.Combine(Directory.GetCurrentDirectory(), cp.OutputAssembly);
Console.WriteLine(dllDir); Assembly ass = Assembly.LoadFile(dllDir);
Type t = ass.GetType("命名空间.类名");
var obj = ass.CreateInstance("命名空间.类名");
MethodInfo mi = t.GetMethod("方法名");
mi.Invoke(obj, new object[] { "Hello _ World!" });
}
}

C#动态编程的更多相关文章

  1. [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程

    [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...

  2. Java动态编程初探——Javassist

    最近需要通过配置生成代码,减少重复编码和维护成本.用到了一些动态的特性,和大家分享下心得. 我们常用到的动态特性主要是反射,在运行时查找对象属性.方法,修改作用域,通过方法名称调用方法等.在线的应用不 ...

  3. 十七、C# 反射、特性和动态编程

    反射.特性和动态编程   1.访问元数据 2.成员调用 3.泛型上的反射 4.自定义特性 5.特性构造器 6.具名参数 7.预定义特性 8.动态编程   特性(attribute)是在一个程序集中插入 ...

  4. Java动态编程---动态代理

    java中动态编程用到的技术有:反射(动态代理),javassist和ASM,这几种动态编程方法相比较,在性能上Javassist高于反射,但低于ASM,因为Javassist增加了一层抽象.在实现成 ...

  5. [.NET] 《Effective C#》快速笔记 - C# 中的动态编程

    <Effective C#>快速笔记 - C# 中的动态编程 静态类型和动态类型各有所长,静态类型能够让编译器帮你找出更多的错误,因为编译器能够在编译时进行大部分的检查工作.C# 是一种静 ...

  6. C# 4动态编程新特性与DLR剖析

    =================================================== 注:很久没有发文了,贴一篇新文吧.从Word直接贴过来的,没仔细排版,诸位海涵.有关DLR和C# ...

  7. 动态编程(Dynamic Programming)

    本文素材来自视频,请自备梯子观看:What Is Dynamic Programming and How To Use It Dynamic Programming:动态编程分为如下几步: 将复杂问题 ...

  8. 使用javassist进行动态编程

    今天在研究dubbo时,发现一个新的知识点,可以使用javassist包进行动态编程,hibernate也使用该包进行编程.晚上百度了很多资料,将它的特性以代码的形式展现出来. package com ...

  9. 【java编程-Javassist】秒懂Java动态编程(Javassist研究)

    作者:ShuSheng007 来源:CSDN 原文:https://blog.csdn.net/ShuSheng0007/article/details/81269295 版权声明:本文为博主原创文章 ...

  10. C# 4.0中的动态类型和动态编程

    # 4.0的主题就是动态编程(Dynamic Programming).虽然C#仍然是一种静态语言,但是对象的意义开始变得越来越“动态”.它们的结构和行为无法通过静态类型来捕获,或者至少编译器在编译程 ...

随机推荐

  1. trie树模板(统计难题)

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

  2. 六、spark常见问题总结(转载)

    问题导读 1.当前集群的可用资源不能满足应用程序的需求,怎么解决? 2.内存里堆的东西太多了,有什么好办法吗?         1.WARN TaskSchedulerImpl: Initial jo ...

  3. Redmine数据库备份及搬家

    Bitnami Redmine的备份分2种方式: 1.导出数据库 2.整个目录搬家 不管是哪种都想停掉服务,redmine相关的服务有以下5个: redmineApache redmineMySQL ...

  4. JavaScript进阶(四)

    现在说说什么是函数.函数的作用可以写一次代码,然后反复的重用这个代码.如:我们要完成多组数和的功能.var sum;sum=3+2;alert(sum); sum=7+8;alert(sum);... ...

  5. 【转】Oracle + PHP Cookbook(php oracle clob 长度超过4000如何写入)

      在甲骨文LOB和PHP工作 由哈里Fuecks 达到4,000字节的限制?输入LOB ... 在这个"Oracle + PHP Cookbook"HowTo中,您将学习可用的L ...

  6. mysql 异常处理

    --该文章内容通过网络搜索组合, mysql 异常,可以自定义异常,再应用.也可使用系统默认的异常,捕获应用. 一.异常定义: DECLARE condition_name CONDITION FOR ...

  7. 信息设计工具IDT创建从SAP Business Object到SAP HANA的连接

    1. 打开Information Design Tool, 并添加BO Server的连接 2. 在Connection上右击, 选择Insert Relational Connection 3. 输 ...

  8. mac下 redis安装使用

    安装redis:brew install redis 开启redis服务:redis-server /usr/local/etc/redis.conf 重新打开一个命令窗口:redis-cli ,进入 ...

  9. webp图片详解

    WebP(发音 weppy),是一种支持有损压缩和无损压缩的图片文件格式,派生自图像编码格式 VP8.根据 Google 的测试,无损压缩后的 WebP 比 PNG 文件少了 45% 的文件大小,即使 ...

  10. Java资源大全中文版

    awesome-java-cn 是 Java 资源大全的中文版,包括开发库.开发工具.网站.博客等,将由伯乐在线持续更新. https://github.com/jobbole/awesome-jav ...