ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – DLR表达式中的“代码作为数据”在哪里?

2019-06-21 12:52:39  阅读:217  来源: 互联网

标签:c expression cil il dynamic-language-runtime


我有这个c#代码:

Console.Writeline("Hello World");

如果我想用DLR表达式执行此操作,它看起来像这样:

MethodInfo method = typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) });
Expression callExpression = Expression.Call(null, method, Expression.Constant("Hello   World"));
Action callDelegate = Expression.Lambda<Action>(callExpression).Compile();
callDelegate();

我从.NET 4中的Pro DLR一书中选择了这个例子.我不明白我们为什么要做这项额外的工作? Book说原因是一旦代码在内存中表示为对象,它就比IL指令更容易分析.

最让我困惑的是:
如果我在我的代码中放入DLR表达式而不是ConsoleWriteline()方法并运行我的控制台应用程序,我将得到相同的.exe文件(包含CIL代码),我将在控制台中写入“Hello world”. exe文件正在执行.所以在这两种情况下我都会得到执行的.exe文件(cil代码),我无法看到那些在运行时将代码表示为数据的对象在哪里以及如何访问它们?

解决方法:

基本上,第二个代码片段正在做的是将调用封装为表达式树.表达式树对于.NET来说是相对较新的(它们是使用除内存中对象之外的数据机制实现Linq互操作所必需的),并且以可变但仍可执行的形式封装程序指令.

如果需要,一旦有了表达式,就可以通过更改Call节点引用的Constant节点的值,将要从“Hello World”输出的文本更改为“Hello Dolly”.您可以更改Call节点以使用不同的MethodInfo,例如调用Debug.WriteLine()或您开发的自定义WriteToLog()方法.你也可以传递那个表达式,保存它,序列化它,并且比这个简单的例子更进一步调用它.所有这些更改和决策都可以在运行时根据编译时未知的信息进行.可以基于文件或数据库中的数据创建动态构造的表达式树,其易于更改并且不需要释放包含该行的DLL或EXE的新版本.

相比之下,对Console.WriteLine()的“静态”调用只能在编译时更改(尽管可能会出现一些非常混乱的IL发射动态代码),如果要求写入该字符串的位置,则需要进行此类更改更改.

标签:c,expression,cil,il,dynamic-language-runtime
来源: https://codeday.me/bug/20190621/1255538.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有