编译C#代码
- using Microsoft.CSharp;
- using System.CodeDom.Compiler;
- using System.Reflection;
- using System.Text;
- namespace System
- {
- public static class CompileCSCAtRuntime
- {
- public static void HelloWorld()
- {
- string code = @"
- using System;
- namespace First
- {
- public class Program
- {
- public static void Main()
- {
- " +
- "Console.WriteLine(\"Hello, world!\");"
- + @"
- }
- }
- }
- ";
- CSharpCodeProvider provider = new CSharpCodeProvider();
- CompilerParameters parameters = new CompilerParameters();
- // Reference to System.Drawing library
- parameters.ReferencedAssemblies.Add("System.Drawing.dll");
- // True - memory generation, false - external file generation
- parameters.GenerateInMemory = true;
- // True - exe file generation, false - dll file generation
- parameters.GenerateExecutable = true;
- CompilerResults results = provider.CompileAssemblyFromSource(parameters, code);
- if (results.Errors.HasErrors)
- {
- StringBuilder sb = new StringBuilder();
- foreach (CompilerError error in results.Errors)
- {
- sb.AppendLine(String.Format("Error ({0}): {1}", error.ErrorNumber, error.ErrorText));
- }
- throw new InvalidOperationException(sb.ToString());
- }
- Assembly assembly = results.CompiledAssembly;
- Type program = assembly.GetType("First.Program");
- MethodInfo main = program.GetMethod("Main");
- main.Invoke(null, null);
- }
- public static void TestMeothds()
- {
- MethodInfo function = CreateFunction("x + 2 * y");
- var betterFunction = (Func<double, double, double>)Delegate.CreateDelegate(typeof(Func<double, double, double>), function);
- Func<double, double, double> lambda = (x, y) => x + 2 * y;
- DateTime start;
- DateTime stop;
- double result;
- int repetitions = 5000000;
- start = DateTime.Now;
- for (int i = 0; i < repetitions; i++)
- {
- result = OriginalFunction(2, 3);
- }
- stop = DateTime.Now;
- Console.WriteLine("Original - time: {0} ms", (stop - start).TotalMilliseconds);
- start = DateTime.Now;
- for (int i = 0; i < repetitions; i++)
- {
- result = (double)function.Invoke(null, new object[] { 2, 3 });
- }
- stop = DateTime.Now;
- Console.WriteLine("Reflection - time: {0} ms", (stop - start).TotalMilliseconds);
- start = DateTime.Now;
- for (int i = 0; i < repetitions; i++)
- {
- result = betterFunction(2, 3);
- }
- stop = DateTime.Now;
- Console.WriteLine("Delegate - time: {0} ms", (stop - start).TotalMilliseconds);
- start = DateTime.Now;
- for (int i = 0; i < repetitions; i++)
- {
- result = lambda(2, 3);
- }
- stop = DateTime.Now;
- Console.WriteLine("Lambda - time: {0} ms", (stop - start).TotalMilliseconds);
- }
- public static double OriginalFunction(double x, double y)
- {
- return x + 2 * y;
- }
- public static MethodInfo CreateFunction(string function)
- {
- string code = @"
- using System;
- namespace UserFunctions
- {
- public class BinaryFunction
- {
- public static double Function(double x, double y)
- {
- return func_xy;
- }
- }
- }
- ";
- string finalCode = code.Replace("func_xy", function);
- CSharpCodeProvider provider = new CSharpCodeProvider();
- CompilerResults results = provider.CompileAssemblyFromSource(new CompilerParameters(), finalCode);
- Type binaryFunction = results.CompiledAssembly.GetType("UserFunctions.BinaryFunction");
- return binaryFunction.GetMethod("Function");
- }
- }
- }
编译C#代码的更多相关文章
- (转载)JAVA动态编译--字节代码的操纵
在一般的Java应用开发过程中,开发人员使用Java的方式比较简单.打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了.这种开发模式背后的过程是:开发人员编写的 ...
- 几款比较好用的C语言的集成开发环境及在windows下用命令行编译C代码
最近要用到C,所以尝试了这几款windows平台下比较好的IDE. VS2015:比较复杂和庞大,据说从2013版本开始支持C99标准. C-free:轻巧,但是不支持C99. vc++6.0:很多学 ...
- GCC编译C代码
C程序的编译过程 常用文件的后缀名: gcc编译c代码 1.gcc 常用编译选项: 2.gcc编译方法 testc.c: #include <stdio.h> int main ...
- JD-GUI反编译后代码逻辑分析
一,用jd-gui.exe等工具查看源代码.如何你不会,可以参看此文章: http://blog.csdn.net/hp_2008/article/details/8207879 可以到以下连接下载可 ...
- 理解Babel是如何编译JS代码的及理解抽象语法树(AST)
Babel是如何编译JS代码的及理解抽象语法树(AST) 1. Babel的作用是? 很多浏览器目前还不支持ES6的代码,但是我们可以通过Babel将ES6的代码转译成ES5代码,让所有的浏览器都 ...
- 使用gulp和bable实现实时编译ES6代码
这篇文章最初发表在我自己折腾的博客站点上:使用gulp和bable实现实时编译ES6代码,该博客用了一位前辈开源的源码,基于thinkjs和vuejs开发,欢迎大家来逛逛. 问题描述> 项目开发 ...
- [UE4]使用UnrealVS扩展快速编译C++代码
一.如果UE4 编辑器已经打开,则VS中的重新生成项目将不能使用,一定要关了UE4 编辑器才可以.一般不是有VS自身的编译UE4的C++代码 二.epic提供了UnrealVS扩展,可以快速编译C++ ...
- AndroidStudio用Cmake方式编译NDK代码(cmake配置.a库)
1.cmake是什么? CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C+ ...
- Android Apk的反编译与代码混淆
一.反编译 1.获取工具: 既然是反编译,肯定要用到一些相关的工具,工具可以到这里下载,里面包含三个文件夹,用于反编译,查看反编译之后的代码: 其实这两工具都是google官方出的,也可在google ...
- 缓冲区溢出实战教程系列(二):dev c++编译汇编代码
小伙伴们对我上一篇文章的反应完全出乎了我的意料,感谢大家对我的支持和认可.接下来我会精心的把这一系列课程设计好,尽量详细的展示给大家.上篇文章我列举了一个缓冲区溢出的小例子,并提到了dev c++.o ...
随机推荐
- 转【】浅谈sql中的in与not in,exists与not exists的区别_
浅谈sql中的in与not in,exists与not exists的区别 1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...
- eclipse根据父类打开子类快捷键
1.打开类 2.双击选中 3.Ctrl+T,打开实现类
- C++11模板类使用心得
1.推荐使用std::shared_ptr<TaskT>代替指针TaskT*使用,shared_ptr是一种智能指针,能自主销毁释放内存,在c++11中被引入,在多线程编程中有很大的用处, ...
- android上引入七牛 上传图片或者文件 最终整理版本(可用)
前言: 以下是引入七牛的步骤,以及在七牛中上传文件和获取文件private 私密地址. 生成上传凭证和获取下载凭证 具体如果使用过程有什么疑问可以加QQ(备注:七牛问题). 1:导入相关的包(注意是4 ...
- hibernate(三) 一对多映射关系
序言 前面两节讲了hibernate的两个配置文件和hello world!.还有hibernate的一级缓存和三种状态,基本上hibernate就懂一点了,从这章起开始一个很重要的知识点,hiber ...
- iOS开发中 workspace 与 static lib 工程的联合使用
在iOS开发中,其实workspace的使用没有完全发挥出来,最近做了一些研究,也想把之前写过的代码整理下,因为iOS里面的布局方式,交互方式也就那么几种.所以,整理好了之后,更能快捷开发,而且能够形 ...
- 动画animation的三个应用(漂浮的白云、旋转的星球、正方体合成)
× 目录 [1]漂浮的白云 [2]旋转的星球 [3]正方体合成 前面的话 前面介绍过动画animation的详细用法,本文主要介绍动画animation的三个效果 漂浮的白云 [效果演示] [简要介绍 ...
- How Spring Boot Autoconfiguration Magic Works--转
原文地址:https://dzone.com/articles/how-springboot-autoconfiguration-magic-works In my previous post &qu ...
- TextView显示html文件中的图片
fromHtml还有另一个重构:fromHtml(String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler) 而I ...
- Cordova webapp实战开发:(7)如何通过简单的方法做到,不重新发布APP来修复bug、增加功能、或者躲开苹果的一些严格审核?
到<Cordova webapp实战开发:(6)如何写一个iOS下获取APP版本号的插件?>为止,我们已经大体学会了如何使用Cordova了,那些都是使用Cordova的开发者必备的技能. ...