1. using Microsoft.CSharp;
  2. using System.CodeDom.Compiler;
  3. using System.Reflection;
  4. using System.Text;
  5.  
  6. namespace System
  7. {
  8. public static class CompileCSCAtRuntime
  9. {
  10. public static void HelloWorld()
  11. {
  12. string code = @"
  13. using System;
  14.  
  15. namespace First
  16. {
  17. public class Program
  18. {
  19. public static void Main()
  20. {
  21. " +
  22. "Console.WriteLine(\"Hello, world!\");"
  23. + @"
  24. }
  25. }
  26. }
  27. ";
  28.  
  29. CSharpCodeProvider provider = new CSharpCodeProvider();
  30. CompilerParameters parameters = new CompilerParameters();
  31.  
  32. // Reference to System.Drawing library
  33. parameters.ReferencedAssemblies.Add("System.Drawing.dll");
  34. // True - memory generation, false - external file generation
  35. parameters.GenerateInMemory = true;
  36. // True - exe file generation, false - dll file generation
  37. parameters.GenerateExecutable = true;
  38.  
  39. CompilerResults results = provider.CompileAssemblyFromSource(parameters, code);
  40.  
  41. if (results.Errors.HasErrors)
  42. {
  43. StringBuilder sb = new StringBuilder();
  44.  
  45. foreach (CompilerError error in results.Errors)
  46. {
  47. sb.AppendLine(String.Format("Error ({0}): {1}", error.ErrorNumber, error.ErrorText));
  48. }
  49.  
  50. throw new InvalidOperationException(sb.ToString());
  51. }
  52.  
  53. Assembly assembly = results.CompiledAssembly;
  54. Type program = assembly.GetType("First.Program");
  55. MethodInfo main = program.GetMethod("Main");
  56.  
  57. main.Invoke(null, null);
  58. }
  59.  
  60. public static void TestMeothds()
  61. {
  62. MethodInfo function = CreateFunction("x + 2 * y");
  63. var betterFunction = (Func<double, double, double>)Delegate.CreateDelegate(typeof(Func<double, double, double>), function);
  64. Func<double, double, double> lambda = (x, y) => x + 2 * y;
  65.  
  66. DateTime start;
  67. DateTime stop;
  68. double result;
  69. int repetitions = 5000000;
  70.  
  71. start = DateTime.Now;
  72. for (int i = 0; i < repetitions; i++)
  73. {
  74. result = OriginalFunction(2, 3);
  75. }
  76. stop = DateTime.Now;
  77. Console.WriteLine("Original - time: {0} ms", (stop - start).TotalMilliseconds);
  78.  
  79. start = DateTime.Now;
  80. for (int i = 0; i < repetitions; i++)
  81. {
  82. result = (double)function.Invoke(null, new object[] { 2, 3 });
  83. }
  84. stop = DateTime.Now;
  85. Console.WriteLine("Reflection - time: {0} ms", (stop - start).TotalMilliseconds);
  86.  
  87. start = DateTime.Now;
  88. for (int i = 0; i < repetitions; i++)
  89. {
  90. result = betterFunction(2, 3);
  91. }
  92. stop = DateTime.Now;
  93. Console.WriteLine("Delegate - time: {0} ms", (stop - start).TotalMilliseconds);
  94.  
  95. start = DateTime.Now;
  96. for (int i = 0; i < repetitions; i++)
  97. {
  98. result = lambda(2, 3);
  99. }
  100. stop = DateTime.Now;
  101. Console.WriteLine("Lambda - time: {0} ms", (stop - start).TotalMilliseconds);
  102. }
  103.  
  104. public static double OriginalFunction(double x, double y)
  105. {
  106. return x + 2 * y;
  107. }
  108.  
  109. public static MethodInfo CreateFunction(string function)
  110. {
  111. string code = @"
  112. using System;
  113.  
  114. namespace UserFunctions
  115. {
  116. public class BinaryFunction
  117. {
  118. public static double Function(double x, double y)
  119. {
  120. return func_xy;
  121. }
  122. }
  123. }
  124. ";
  125.  
  126. string finalCode = code.Replace("func_xy", function);
  127.  
  128. CSharpCodeProvider provider = new CSharpCodeProvider();
  129. CompilerResults results = provider.CompileAssemblyFromSource(new CompilerParameters(), finalCode);
  130.  
  131. Type binaryFunction = results.CompiledAssembly.GetType("UserFunctions.BinaryFunction");
  132. return binaryFunction.GetMethod("Function");
  133. }
  134. }
  135. }

  

编译C#代码的更多相关文章

  1. (转载)JAVA动态编译--字节代码的操纵

    在一般的Java应用开发过程中,开发人员使用Java的方式比较简单.打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了.这种开发模式背后的过程是:开发人员编写的 ...

  2. 几款比较好用的C语言的集成开发环境及在windows下用命令行编译C代码

    最近要用到C,所以尝试了这几款windows平台下比较好的IDE. VS2015:比较复杂和庞大,据说从2013版本开始支持C99标准. C-free:轻巧,但是不支持C99. vc++6.0:很多学 ...

  3. GCC编译C代码

    C程序的编译过程       常用文件的后缀名: gcc编译c代码 1.gcc 常用编译选项: 2.gcc编译方法 testc.c: #include <stdio.h> int main ...

  4. JD-GUI反编译后代码逻辑分析

    一,用jd-gui.exe等工具查看源代码.如何你不会,可以参看此文章: http://blog.csdn.net/hp_2008/article/details/8207879 可以到以下连接下载可 ...

  5. 理解Babel是如何编译JS代码的及理解抽象语法树(AST)

    Babel是如何编译JS代码的及理解抽象语法树(AST) 1. Babel的作用是?   很多浏览器目前还不支持ES6的代码,但是我们可以通过Babel将ES6的代码转译成ES5代码,让所有的浏览器都 ...

  6. 使用gulp和bable实现实时编译ES6代码

    这篇文章最初发表在我自己折腾的博客站点上:使用gulp和bable实现实时编译ES6代码,该博客用了一位前辈开源的源码,基于thinkjs和vuejs开发,欢迎大家来逛逛. 问题描述> 项目开发 ...

  7. [UE4]使用UnrealVS扩展快速编译C++代码

    一.如果UE4 编辑器已经打开,则VS中的重新生成项目将不能使用,一定要关了UE4 编辑器才可以.一般不是有VS自身的编译UE4的C++代码 二.epic提供了UnrealVS扩展,可以快速编译C++ ...

  8. AndroidStudio用Cmake方式编译NDK代码(cmake配置.a库)

    1.cmake是什么? CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C+ ...

  9. Android Apk的反编译与代码混淆

    一.反编译 1.获取工具: 既然是反编译,肯定要用到一些相关的工具,工具可以到这里下载,里面包含三个文件夹,用于反编译,查看反编译之后的代码: 其实这两工具都是google官方出的,也可在google ...

  10. 缓冲区溢出实战教程系列(二):dev c++编译汇编代码

    小伙伴们对我上一篇文章的反应完全出乎了我的意料,感谢大家对我的支持和认可.接下来我会精心的把这一系列课程设计好,尽量详细的展示给大家.上篇文章我列举了一个缓冲区溢出的小例子,并提到了dev c++.o ...

随机推荐

  1. 转【】浅谈sql中的in与not in,exists与not exists的区别_

    浅谈sql中的in与not in,exists与not exists的区别   1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...

  2. eclipse根据父类打开子类快捷键

    1.打开类 2.双击选中 3.Ctrl+T,打开实现类

  3. C++11模板类使用心得

    1.推荐使用std::shared_ptr<TaskT>代替指针TaskT*使用,shared_ptr是一种智能指针,能自主销毁释放内存,在c++11中被引入,在多线程编程中有很大的用处, ...

  4. android上引入七牛 上传图片或者文件 最终整理版本(可用)

    前言: 以下是引入七牛的步骤,以及在七牛中上传文件和获取文件private 私密地址. 生成上传凭证和获取下载凭证 具体如果使用过程有什么疑问可以加QQ(备注:七牛问题). 1:导入相关的包(注意是4 ...

  5. hibernate(三) 一对多映射关系

    序言 前面两节讲了hibernate的两个配置文件和hello world!.还有hibernate的一级缓存和三种状态,基本上hibernate就懂一点了,从这章起开始一个很重要的知识点,hiber ...

  6. iOS开发中 workspace 与 static lib 工程的联合使用

    在iOS开发中,其实workspace的使用没有完全发挥出来,最近做了一些研究,也想把之前写过的代码整理下,因为iOS里面的布局方式,交互方式也就那么几种.所以,整理好了之后,更能快捷开发,而且能够形 ...

  7. 动画animation的三个应用(漂浮的白云、旋转的星球、正方体合成)

    × 目录 [1]漂浮的白云 [2]旋转的星球 [3]正方体合成 前面的话 前面介绍过动画animation的详细用法,本文主要介绍动画animation的三个效果 漂浮的白云 [效果演示] [简要介绍 ...

  8. How Spring Boot Autoconfiguration Magic Works--转

    原文地址:https://dzone.com/articles/how-springboot-autoconfiguration-magic-works In my previous post &qu ...

  9. TextView显示html文件中的图片

    fromHtml还有另一个重构:fromHtml(String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler) 而I ...

  10. Cordova webapp实战开发:(7)如何通过简单的方法做到,不重新发布APP来修复bug、增加功能、或者躲开苹果的一些严格审核?

    到<Cordova webapp实战开发:(6)如何写一个iOS下获取APP版本号的插件?>为止,我们已经大体学会了如何使用Cordova了,那些都是使用Cordova的开发者必备的技能. ...