c# 动态编译CodeDomProvider.CompileAssemblyFromSource(CompilerParameters cp,string code)
1.使用c#动态编译,可参考如下:
//生成c#代码
string code = GenerateCode();
CodeDomProvider cdp = CodeDomProvider.CreateProvider("C#"); // 编译器的参数
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add(typeof(T).Assembly.Location);
cp.ReferencedAssemblies.Add("System.Core.dll");//添加引用
foreach (var ass in typeof(T).Assembly.GetReferencedAssemblies())
{
if (ass.Name != "System.Core")
{
var refAss = AppDomain.CurrentDomain.GetAssemblies().SingleOrDefault(assembly => assembly.GetName().Name == ass.Name);
if (refAss != null)
cp.ReferencedAssemblies.Add(refAss.Location);
}
}
//GenerateExecutable是设置编译后生成的是dll还是exe,true是dll,false是exe,默认是生成dll的
cp.GenerateExecutable = false;
//对于GenerateInMemory这个属性,MSDN上说的是true就把编译的生成的程序集保留在内存中,
//通过CompilerResults实例的CompiledAssembly可以获取。如果设为false则是生成文件保存在磁盘上,
//通过CompilerResults实例的PathToAssembly实例获取程序集的路径。事实是,无论GenerateInMemory设置哪个值,
//都会在硬盘上生成相应的文件,区别在于OutputAssembly设置了相应的文件名的话,生成的文件会存在指定路径上,
//否则会存放在系统的临时文件夹里面
cp.GenerateInMemory = true;
//此处如果不加,在某些情况下,默认生成的cp.TempFiles.BasePath=C:\Users\Administrator\AppData\Local\Temp\2\j2uudvfi,而不是
//cp.TempFiles.BasePath=C:\Users\Administrator\AppData\Local\Temp\j2uudvfi,由于\2这一层级的文件夹未创建,导致抛出
//"未能找到路径……的一部分"的异常,此处初始化一下cp.TempFiles,则可避免此问题
cp.TempFiles = new TempFileCollection(System.IO.Path.GetTempPath());
CompilerResults cr = cdp.CompileAssemblyFromSource(cp, code); //动态编译出错时
if (cr.Errors.HasErrors)
{
Exception ex = new Exception();
ex.Data["code"] = code;
throw ex;
}
else
{
// 编译后的程序集
Assembly ass = cr.CompiledAssembly;
//Namespace是命名空间,Class是类名,赋值为需要的
Type type = ass.GetType(string.Format("{0}.{1}", Namespace, Class));
MethodInfo objectToString = type.GetMethod("ObjectToString");
//动态执行的方法
structToStringExecutor = new DynamicMethodExecutor(objectToString);
}
c# 动态编译CodeDomProvider.CompileAssemblyFromSource(CompilerParameters cp,string code)的更多相关文章
- 分享基于.NET动态编译&Newtonsoft.Json封装实现JSON转换器(JsonConverter)原理及JSON操作技巧
看文章标题就知道,本文的主题就是关于JSON,JSON转换器(JsonConverter)具有将C#定义的类源代码直接转换成对应的JSON字符串,以及将JSON字符串转换成对应的C#定义的类源代码,而 ...
- 重写代码生成器支持模板(多层架构,MVC),多语言c#,java;支持mysql和sqlserver,动态编译
多年前用过李天平前辈的,自己改过,后来李老师做动软了,不给源码,修改不是很方便.加上我目前需要转java方向,于是决定自己搞.到目前为止花了整整一个星期了,看看目前的成果. 最后是代码工程文件,用c# ...
- .net 动态编译解决考勤计算问题
由于公司实施SAP HR项目,但是SAP HR对考勤功能真的太弱化了,直接从考勤机上读取的原始打卡记录不能直接传输到HR系统里面,因为SAP HR不能识别那些多余的打卡记录,而且必须把打卡记录进行成组 ...
- 【.net 深呼吸】细说CodeDom(9):动态编译
知道了如果构建代码文档,知道了如何生成代码,那么编译程序集就很简单了. CodeDomProvider 类提供了三个可以执行编译的方法: 1.CompileAssemblyFromSource——这个 ...
- C# 动态类型与动态编译简介
关于C#的动态类型与动态编译的简介,主要是一个Demo. 动态类型 关键字: dynamic 这里有详细的介绍:[C#基础知识系列]专题十七:深入理解动态类型 动态类型的应用场景 可以减少强制转换(强 ...
- [Unity] 编辑器运行中动态编译执行C#代码
(一)问题 之前写Lua时,修改完代码 reload 就可以热重载代码,调试起来十分方便(重构则十分痛苦). 现在使用 C# 做开发,目前还没找到比较方便地进行热重载的方式.只能退而求其次,在调试上找 ...
- c#动态编译并动态生成dll
/// <summary> /// 动态编译并执行代码 /// </summary> /// <param name="code">代码< ...
- .NET中的动态编译
代码的动态编译并执行是一个.NET平台提供给我们的很强大的工具用以灵活扩展(当然是面对内部开发人员)复杂而无法估算的逻辑,并通过一些额外的代码来扩展我们已有 的应用程序.这在很大程度上给我们提供了另外 ...
- C#动态编译代码,执行一个代码片段,或者从指定文件中加载某个接口的实现类
在项目进行中有时候会需要配置一些复杂的表达式,在程序运行的时候执行表达式,根据结果执行相应的操作,简单写了一个类Expression,利用.net的动态编译技术实现,代码如下: public clas ...
随机推荐
- 【转】awk学习笔记
Awk学习笔记 整理:Jims of 肥肥世家 <jims.yang@gmail.com> Copyright © 2004 本文遵从GPL协议,欢迎转载.修改.散布. 第一次发布时间:2 ...
- Can you answer these queries V SPOJ - GSS5 (分类讨论+线段树维护区间最大子段和)
recursion有一个整数序列a[n].现在recursion有m次询问,每次她想知道Max { A[i]+A[i+1]+...+A[j] ; x1 <= i <= y1 , x2 &l ...
- 安装theano遇到的问题
嗯,听说keras虽然说有TensorFlow有backend就够了,在TensorFlow和theano之间来回切换还是会有用的,然后又补安装了theano 之前解了权限了,所以不需要sudo 直接 ...
- 【每日一包0015】gradient-string
[github地址:https://github.com/ABCDdouyae...] gradient-string 用于在终端打印出好看的渐变文字 普通用法 console.log(gradien ...
- 数据库中char和varchar的区别
1. char类型的长度是固定的,varchar的长度是可变的. 这就表示,存储字符串'abc',使用char(10),表示存储的字符将占10个字节(包括7个空字符) 使用varchar2(10),, ...
- Oracle之:Function :numberToDate()
create or replace function numberToDate(i_date in number) return date is v_date number; result date ...
- springboot与springcloud版本不对应导致报错java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.<init>([Ljava/lang/Object;)V
springboot启动报错: 10:31:50.221 [main] ERROR org.springframework.boot.SpringApplication - Application r ...
- 去除弹窗自带url提示
window.alert = function(name){ var iframe = document.createElement("IFRAME"); iframe.style ...
- Windows下安装sass和compass失败的解决办法
sass依赖Ruby,所以,首先得先安装个Ruby sass的安装步骤: 在安装的时候,请勾选Add Ruby executables to your PATH这个选项,添加环境变量,不然以后使用编译 ...
- Codeforces 474D Flowers(DP)
题目链接 非常简单的一道dp题,通过O(n)的预处理来使查询变为O(1). 主要的坑在于取模后的dp数组的前缀和再相减可能得到负数,导致无法得到某一区间和的取模. 解决方法:(a-b)%mo==(a% ...