惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cisco Talos Blog
Cisco Talos Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Vercel News
Vercel News
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Schneier on Security
Blog — PlanetScale
Blog — PlanetScale
Google DeepMind News
Google DeepMind News
博客园 - 司徒正美
NISL@THU
NISL@THU
T
Threat Research - Cisco Blogs
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Latest news
Latest news
H
Help Net Security
雷峰网
雷峰网
Spread Privacy
Spread Privacy
Cyberwarzone
Cyberwarzone
Project Zero
Project Zero
Security Latest
Security Latest
Know Your Adversary
Know Your Adversary
人人都是产品经理
人人都是产品经理
P
Privacy & Cybersecurity Law Blog
M
MIT News - Artificial intelligence
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
P
Proofpoint News Feed
U
Unit 42
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
博客园 - 三生石上(FineUI控件)
Stack Overflow Blog
Stack Overflow Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cybersecurity and Infrastructure Security Agency CISA
量子位
C
Cyber Attacks, Cyber Crime and Cyber Security
S
Securelist
S
Security @ Cisco Blogs
T
Threatpost
P
Palo Alto Networks Blog
C
Check Point Blog
V
Vulnerabilities – Threatpost
T
Tailwind CSS Blog
B
Blog RSS Feed
Recorded Future
Recorded Future
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
P
Proofpoint News Feed
P
Privacy International News Feed
AWS News Blog
AWS News Blog
博客园 - 叶小钗
WordPress大学
WordPress大学

博客园 - 牟向阳

Implementing SQL Server Row and Cell Level Security Daily English 你知道你的後照鏡調錯了嗎?原來裡面隱藏著視線死角! Silverlight Freezing & Crash Silverlight 中实现Service同步调用 Silverlight:获取ContentTemplate中的命名控件 silverlight 4常用的多线程技术 推荐几款Silverlight Tools【转载】 一个配置文件的Mapping Custom DataContractSerializerOperationBehavior SQL Service查询分析 WPF&Silverlight精髓 支持定位当前页,自定义排序的分页SQL(拒绝动态SQL) WCF学习经验分享,如何更好地学习WCF? 后台管理界面收集 两个使用的Ajax Demo 自学面向对象 发几个有价值的.net源码 我是如何带领团队开发项目的
Emit Vs CodeDom
牟向阳 · 2011-01-30 · via 博客园 - 牟向阳

Emit 和 CodeDom 都是用来动态创建类型,并利用反射执行的东东~~~~ 这两个都是 .NET Framework 中比较有深度的内容。

有关 CodeDom,雨痕已经写过好几篇了,此处不再详述。CodeDom 利用 C#/VB.NET 等编译引擎进行动态编译,而 Emit 则直接使用 IL,从编程方便的角度来说 CodeDom 更方便一点。当然 CodeDom 要花费一定的编译时间,而一旦载入则和 Emit 或静态编译程序集没有什么区别。Emit 被很多 AOP/ORM 组件所使用,除了 ILGenerator 外,和 CodeDom 的编程习惯很相似。接下来雨痕会写几篇 Emit 的使用文章。

好了,从经典的 "Hello, World!" 开始。我们本次的目标是用 Emit 重写下面的类型,并完成动态调用。

代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.CodeDom;
using System.Reflection;
using System.Reflection.Emit;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Globalization;namespace ConsoleApplication5
{
/// <summary>
/// Emit 和 CodeDom 都是用来动态创建类型,并利用反射执行的东东~~~~
/// </summary>
class Program
{
static void Main(string[] args)
{
/*
//一,Emit 则直接使用 IL
//1. 定义动态程序集
AssemblyName assemblyName = new AssemblyName("Nettip.Assembly");
AssemblyBuilder assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);

//2. 定义动态模块
ModuleBuilder module = assembly.DefineDynamicModule("Nettip.QueryOrderConditon.Module");

//3. 定义类型
TypeBuilder type = module.DefineType("QueryOrderCondition", TypeAttributes.Class, typeof(object));

//4. 定义方法
MethodBuilder method = type.DefineMethod("Test", MethodAttributes.Public, CallingConventions.HasThis, null, null);

//5. 方法代码
ILGenerator il = method.GetILGenerator();
il.Emit(OpCodes.Nop);
il.Emit(OpCodes.Ldstr, "Hello, World!");
il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
il.Emit(OpCodes.Nop);
il.Emit(OpCodes.Ret);

//6. 执行
Type class1 = type.CreateType();
object o = Activator.CreateInstance(class1);
o.GetType().GetMethod("Test").Invoke(o, null);

*/
//二,CodeDom 利用 C#/VB.NET 等编译引擎进行动态编译

#region
// 1. 使用CodeDom创建源码
//CodeCompileUnit cu = new CodeCompileUnit();
//CodeNamespace Samples = new CodeNamespace("Samples");
//cu.Namespaces.Add(Samples);
//Samples.Imports.Add(new CodeNamespaceImport("System"));
//CodeTypeDeclaration Class1 = new CodeTypeDeclaration("Class1");
//Samples.Types.Add(Class1);
//CodeEntryPointMethod Start = new CodeEntryPointMethod();
//CodeMethodInvokeExpression cs1 = new CodeMethodInvokeExpression(
// new CodeTypeReferenceExpression("System.Console"), "WriteLine",
// new CodePrimitiveExpression("Hello World!") );
//Start.Statements.Add(new CodeExpressionStatement(cs1));
//Class1.Members.Add(Start);

string code = @"
using System;
namespace Nettip
{
public class QueryOrderCondition

private string name;

public QueryOrderCondition(string name)
{
this.name = name;
}

public void Test()
{
Console.WriteLine(""{0} - {1}"", name, DateTime.Now);
}
}
}

";#endregion
//1. 创建编译器对象
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");//2. 设置编译参数
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add(
"System.dll");
cp.GenerateInMemory
= false;
cp.OutputAssembly
= "Nettip.QueryOrderCondition.dll";//3. 开始编译
CompilerResults results = provider.CompileAssemblyFromSource(cp, code);
//3.1 显示编译信息
if (results.Errors.Count == 0)
Console.WriteLine(
"\"{0}\" compiled ok!", results.CompiledAssembly.Location);
else
{
Console.WriteLine(
"Complie Error:");
foreach (CompilerError error in results.Errors)
Console.WriteLine(
" {0}", error);
}
//4.执行
Type t = results.CompiledAssembly.GetType("Nettip.QueryOrderCondition");
object o = results.CompiledAssembly.CreateInstance("Nettip.QueryOrderCondition", false, BindingFlags.Default,
null, new object[] { "Tom" }, CultureInfo.CurrentCulture, null);
t.InvokeMember(
"Test", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod,
null, o, null);
}
}
}