- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为 Microsoft DLR 开发一种小型编程语言,在调用我的匿名方法时遇到一些问题。具体来说,代码:
Delegate CompiledBody = Expression.Lambda(rt.Parser.ParseSingle(Body), parms).Compile();
因此,parms 是一个包含单个 ParameterExpression 的数组,第一个参数包含用于定义匿名函数的适当表达式。当我尝试在 CompiledBody.Method(一种 MethodInfo)上使用 Expression.Call 调用我的委托(delegate)时,我收到错误:
Unhandled Exception: System.ArgumentException: Expression of type 'System.Object'
cannot be used for parameter of type 'System.Runtime.CompilerServices.Closure'
of method 'Shiro.Runtime.ShiroAtom lambda_method(System.Runtime.CompilerServices
.Closure, Shiro.Runtime.ShiroAtom)'
现在,我的单参数方法获得了第二个参数,类型为 System.Runtime.CompilerServices.Closure(第二个参数为 ShiroAtom,是我的参数)。这是有道理的,除了 (a) 我真的不在乎此上下文中的方法是否在 Closure 范围内,并且 (b) 我似乎无法创建一个空的 Closure 范围来传递此参数。
如果有任何帮助,我将不胜感激!提前致谢。
编辑:一些基于下面精彩回复的额外信息:
此代码出现的位置在我的解析器的深处。我有一个被翻译成 AST 的标记流(实际上是 Atoms)。这个特定的位是函数调用解析例程。它创建了一个 CompiledBody,然后尝试使用如下方式调用它:
return Expression.Call(CompiledBody.Method, Expression.Constant("argument"));
生成的 Lambda 表示一个函数。根据我的体系结构,只有少数地方可以调用 DynamicInvoke 或仅调用 Compiled Delegate,而这不是其中之一。我希望我能提供一个更具体的例子,但这种情况发生在一个手工编码的解析器中,而且需要太多代码才能真正传达为什么情况是这样的,但我确实需要一种方法来通过 Expression.Call 调用已编译的 Lambda,如上所示。
问题的症结在于我的 Compiled Lambda 需要 1 个额外的参数到我指定的参数,一个 CompilerServices.Closure,而我不知道如何制作一个。
最佳答案
如果您可以共享您正在编译的正文,那将会很有帮助,因为它包含实际的闭包以及您如何调用它。我的猜测是您试图以某种方式“手动”调用生成的委托(delegate),而不是保留委托(delegate)对象的某些内容并简单地生成一个 Invoke 表达式。如果你想使用 DLR 闭包,它应该是这样的:
using System;
using System.Linq.Expressions;
class Program {
static void Main(string[] args) {
var outerParam = Expression.Parameter(typeof(int), "outerParam");
var lambda =
Expression.Lambda<Func<int, Action>>(
Expression.Lambda<Action>(
Expression.Call(
typeof(Console).GetMethod("WriteLine", new Type[] { typeof(object) }),
Expression.Convert(outerParam, typeof(object))
)
),
outerParam
).Compile();
var actionParam = Expression.Parameter(typeof(Action), "action");
var lambdaInvoker =
Expression.Lambda<Action<Action>>(
Expression.Invoke(actionParam),
actionParam
).Compile();
lambdaInvoker(lambda(100));
lambdaInvoker(lambda(200));
Console.ReadLine();
}
}
这创建了 3 个 lambda:第一个包含第二个内部 lambda,它关闭了一个参数。生成的闭包委托(delegate)的类型是创建 lambda 表达式时指定的类型,即使那里有一个额外的隐藏参数。第三个 lambda 展示了如何从另一个 lambda 调用它——即通过委托(delegate)调用。最后,我们将委托(delegate)链接在一起以展示其工作原理。
还有一件事要提醒我们,由于 CLR 的限制,DLR 闭包现在实际上并没有那么出色。创建闭包实际上是一个非常缓慢的过程,因为它需要通过反射而不是直接创建委托(delegate)。如果您担心委托(delegate)的性能,您将希望通过您自己的数据结构跟踪变量和关闭值的流程(这就是 IronRuby 和 IronPython 所做的)。
关于c# - DLR LambdaExpressions 和 System.Runtime.CompilerServices.Closure 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6233792/
我在一个较大的 C# 项目的一小部分中使用 DLR,IronPython 是有问题的语言。 对于系统的某些部分,用户可以输入一个小脚本来为它们定制行为。我想要做的是能够限制他们使用无副作用的纯函数或在
首先,我已经阅读Making a CLR/.NET Language Debuggable,但是仍然难以实现。 我编写了一种玩具语言,该语言可以通过生成Linq表达式,然后调用LambdaExpres
.Net 4 将具有 DLR(动态语言运行时)。我知道它将用于 Iron Python 和 Iron Ruby 之类的东西。但这就是它的全部好处吗? DLR 有什么用处? DLR 是如何工作的? 最佳
是否可以从非托管代码(例如 C++ 或 Delphi)调用托管代码,特别是 IronRuby 或 IronPython? 例如,我们有一个用 Delphi 编写的应用程序正在迁移到 C#.NET。我们
我到处都读到 .net 4 中的新 DLR,他们说它的一个很好的用途是反射,并且总是显示的代码片段类似于 dynamic d = GetSomeObject(); d.DoSomething(); d
我打算创建一个 Web 服务,以尽可能快的速度执行大量手动指定的计算,并且一直在探索 DLR 的使用。 抱歉,如果本文很长,请随意浏览并了解总体要点。 我一直在使用 IronPython 库,因为它使
我正在考虑限制使用 C# 的 dynamic 关键字。我的initial time trials令人惊讶 - 100,000 次迭代的性能下降不到一秒(可能是由于 DLR 缓存)。 不过,我无权访问内
我需要 DLR 的帮助。我正在实现 IDynamicMetaObjectProvider 和 DynamicMetaObject,但我在获取预期的返回类型时遇到了一些问题。我在元对象中覆盖了 Bind
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 8年前关闭。 Improve thi
随着 .NET 4.0 测试版的推出,以及 .NET 动态语言运行时的更广泛的可用性,我猜这些类型的主题将变得“更热”。 我对 DLR 和 PowerShell 之间的概念差异感到困惑。在我看来,如果
我使用 Antlr 编写了一个 DSL,用于从我的语法文件生成词法分析器和解析器。解析器生成一个抽象语法树,其中包含我可以计算的各种节点(例如函数节点)。在函数节点的代码中,我负责绑定(bind)——
我目前正在使用 DLR 执行以下操作来创建和执行简单的 Python 计算: ScriptRuntime runtime = Python.CreateRuntime(); ScriptEngine
我需要指出正确的方向。我已将 Iron Python 脚本宿主嵌入到一个简单的 C# 应用程序中,但现在我需要了解锁定用户生成的 IronPython 或 IronRuby 脚本的安全性的最佳实践。
DLR 层的职责是什么? 最佳答案 来自 http://msdn.microsoft.com/en-us/library/dd233052.aspx 处的文档. The purpose of the
我正在尝试学习如何在 DLR 之上编写简单的脚本语言,方法是使用一个名为 ToyScript 的非常古老的 DLR 示例。但是 ToyScript 似乎不支持以下脚本结构,我想在我的实现中使用它: p
我对 DynamicMethods、表达式树和 DLR 之间的交互和关系有一些疑问。 我知道 LambdaExpression.Compile 在内部使用 ILGenerator 来创建委托(dele
我必须为 .NET 的静态类型语言开发一个编译器,我正在考虑为此使用 DLR,而不是构建所有部分(词法分析器/解析器、语法、语义、代码生成)。 DLR 是否适合这种情况?或者直接为 .NET 构建编译
我刚刚开始尝试更多地了解 .Net VM 基础,但立即被某些东西抛弃了。我知道有一个叫做 DLR 的新东西,它允许 C# 中的所有动态内容和 IronX 语言的运行。但是现在我正在阅读有关这种称为 B
我正在构建一个针对 .NET 的编译器,并且我之前已经直接生成了 CIL,但是生成 DLR 树将使我的生活变得更加轻松。我支持一些动态功能,即运行时函数创建和鸭子类型,但绝大多数代码是完全静态的。 既
来自维基百科关于 DLR 的条目, 看起来 DLR 的目的是为了使用 Python、Ruby 等语言。这就是 DLR 的全部吗?还有其他好处吗?为什么要为 ASP.net 项目或 Winform 应用
我是一名优秀的程序员,十分优秀!