C#动态编程
- 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#动态编程的更多相关文章
- [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程
[.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...
- Java动态编程初探——Javassist
最近需要通过配置生成代码,减少重复编码和维护成本.用到了一些动态的特性,和大家分享下心得. 我们常用到的动态特性主要是反射,在运行时查找对象属性.方法,修改作用域,通过方法名称调用方法等.在线的应用不 ...
- 十七、C# 反射、特性和动态编程
反射.特性和动态编程 1.访问元数据 2.成员调用 3.泛型上的反射 4.自定义特性 5.特性构造器 6.具名参数 7.预定义特性 8.动态编程 特性(attribute)是在一个程序集中插入 ...
- Java动态编程---动态代理
java中动态编程用到的技术有:反射(动态代理),javassist和ASM,这几种动态编程方法相比较,在性能上Javassist高于反射,但低于ASM,因为Javassist增加了一层抽象.在实现成 ...
- [.NET] 《Effective C#》快速笔记 - C# 中的动态编程
<Effective C#>快速笔记 - C# 中的动态编程 静态类型和动态类型各有所长,静态类型能够让编译器帮你找出更多的错误,因为编译器能够在编译时进行大部分的检查工作.C# 是一种静 ...
- C# 4动态编程新特性与DLR剖析
=================================================== 注:很久没有发文了,贴一篇新文吧.从Word直接贴过来的,没仔细排版,诸位海涵.有关DLR和C# ...
- 动态编程(Dynamic Programming)
本文素材来自视频,请自备梯子观看:What Is Dynamic Programming and How To Use It Dynamic Programming:动态编程分为如下几步: 将复杂问题 ...
- 使用javassist进行动态编程
今天在研究dubbo时,发现一个新的知识点,可以使用javassist包进行动态编程,hibernate也使用该包进行编程.晚上百度了很多资料,将它的特性以代码的形式展现出来. package com ...
- 【java编程-Javassist】秒懂Java动态编程(Javassist研究)
作者:ShuSheng007 来源:CSDN 原文:https://blog.csdn.net/ShuSheng0007/article/details/81269295 版权声明:本文为博主原创文章 ...
- C# 4.0中的动态类型和动态编程
# 4.0的主题就是动态编程(Dynamic Programming).虽然C#仍然是一种静态语言,但是对象的意义开始变得越来越“动态”.它们的结构和行为无法通过静态类型来捕获,或者至少编译器在编译程 ...
随机推荐
- 使用 IDEA 创建 Maven Web 项目 (异常)- Disconnected from the target VM, address: '127.0.0.1:59770', transport: 'socket'
运行环境: JDK 版本:1.8 Maven 版本:apache-maven-3.3.3 IDEA 版本:14 maven-jetty-plugin 配置: <plugin> <gr ...
- Hibernate缓存配置
一级缓存 Hibernate的一级缓存是由Session提供的,因此它只存在于Session的生命周期中,当程序调用save(),update(),saveorupdate()等方法 及调用查询接口l ...
- c++内存对齐 转载
转载自http://blog.csdn.net/chengonghao/article/details/51674166 例子举的特别好 很多文章大概都有像这样的结论: 1. 数据项只能存储在地址是数 ...
- HostingEnvironment RegisterObject和QueueBackgroundWorkItem
其实网上关于HostingEnvironment 的RegisterObject和QueueBackgroundWorkItem文章已经很多了,典型是的 QueueBackgroundWorkItem ...
- JSON反序列化实体类
1.定义实体类 [DataContract] public class CustomerWordOrderViewModel { [DataMember] public string Name; [D ...
- 【C#】Switch datatype between object and byte[]
This sample shows how to turn object to byte[], as well as turn byte[] to object. So,I can turn any ...
- python 数据清洗之字符串处理
在数据分析中,特别是文本分析中,字符处理需要耗费极大的精力, 因而了解字符处理对于数据分析而言,也是一项很重要的能力. 字符串处理方法 首先我们先了解下都有哪些基础方法 首先我们了解下字符串的拆分sp ...
- 【jQuery、原生】键盘键入两位小数
jquery的处理办法 <!doctype html> <html lang="en"> <head> <meta charset=&qu ...
- 使用 FormsAuthentication 来进行登录验证
1.在web.config文件中,<system.web>/<authentication>配置节用于对验证进行配置.为<authentication>节点提供mo ...
- ManualResetEvent和AutoResetEvent的区别
在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的.(这不是废话) 先来讨论ManualResetEvent,讨论过程中我会穿插一些AutoResetEvent的内容, ...