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!" });
}
}

最新文章

  1. 聊聊excel生成图片的几种方式
  2. hibernate学习笔记之四 Hibernate的增删改查
  3. todoList使用教程
  4. SQL入门语句之LIKE、GLOB和LIMIT
  5. LeetCode 7 Reverse Integer(反转数字)
  6. SpringMVC整合Quartz实现定时任务以及Tomcat服务执行初始化定时任务
  7. 【LOB】使用USER_LOBS视图获得当前用户包含LOB字段的表
  8. DB2缓冲池、表空间
  9. Thinkphp join 连接查询
  10. 依赖注入及AOP简述(一)——“依赖”的概念 .
  11. oracle03
  12. IIS部署发布flask网站
  13. 51-迷宫(一)- java版dfs和bfs
  14. 通过TABULATE过程制作汇总报表
  15. JNI NDK (AndroidStudio+CMake )实现C C++调用Java代码流程
  16. verilog-testbench 时钟和复位模板
  17. vue 的router的简易运用
  18. 5G的真正价值
  19. bzoj 2141 : 排队 (cdq分治+bit)
  20. [Laravel] 12 - WEB API : cache implement

热门文章

  1. php最新学习-----文件的操作
  2. 实体类转Json的2种方法
  3. PostScript学习:另一种缩写为PS的技术
  4. js 禁止复制粘贴全选
  5. 简述java程序中的main方法
  6. hdu1040
  7. Imagine Cup 微软“创新杯”全球学生科技大赛
  8. oracle 增加表空间
  9. 最简单的MFC
  10. c# 读取ACCESS 数据库