问题标签 [dynamicmethod]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
204 浏览

c# - DynamicILInfo.GetTokenFor(MethodHandle,RuntimeTypeHandle) 不适用于可变参数方法调用

考虑以下代码:

似乎这DynamicILInfo.GetTokenFor(MethodHandle,RuntimeTypeHandle)不适用于可变参数方法调用(TestMethodVarArgs上面代码中的调用)。如果我执行动态方法,它会给出“JIT 编译器遇到内部限制”异常。

这是一个错误吗?局限性?有没有解决的办法?

0 投票
1 回答
1580 浏览

c# - 防止 DynamicMethod VerificationException - 操作可能会破坏运行时

我正在使用 IL 生成创建一个简单的反序列化器方法,该方法从 Lucene 文档中取出字符串并设置引用类型对象 (POCO) 的属性或字段。

每当我尝试运行生成的方法时,都会收到 VerificationException 错误。关于此错误还有其他问题,其中一些与 DynamicMethods 有关,但据我所知,我遇到的问题是不同的。

操作可能会破坏运行时和动态方法与值类型

msil 操作可能会破坏运行时异常的稳定性

尽管该方法将来会变得更加复杂,但我现在只是在进行字符串分配。我尝试动态创建的方法将如下所示:

PocoObject 看起来像这样:

我试图完全复制从编译时代码生成的 IL(甚至是不必要的位),它看起来像这样:

我已经设法将 DynamicMethod 保存到磁盘上的程序集中,检查了它,这正是它带来的。逐行它与编译时方法IL相同。

然而,在执行动态方法时,会抛出上述错误。有谁知道我该如何解决这个问题?

注意:如果有人想仔细查看,我在 GitHub 上有源代码。IL 生成代码在 LukeMapper.cs:GetDumbDeserializer() 中(第 133 行)

LukeMapper GitHub 存储库

感谢所有帮助!谢谢!


编辑:所以我简化了 IL 生成代码,它基本上如下:

我根据 kvbs 的评论添加了il.DeclareLocal(type)(其中类型是 PocoObject),但我不确定我是否将它放在正确的位置(或者它是否重要)。

0 投票
1 回答
926 浏览

c# - 为什么这个 DynamicMethod (ldarg.1, newobj, ret) 会触发 VerificationException?

我有一个将构造函数包装在动态工厂方法中的方法:

但是,以下代码会VerificationException.Invoke(…):

如果我替换,则不会引发异常ldarg.1newobj <ctor>ldnull所以问题肯定是由这两条IL指令引起的。进一步的实验表明,错误在于ldarg.1。(对于上面的具体示例,我已将其替换为 a ldstr <string>。)

有人看到这些 IL 指令有什么问题吗?

0 投票
0 回答
111 浏览

.net - 动态方法和函数代表

我有一个看起来像这样的类:

现在我想使用DynamicMethod该类来发出创建ClassWithFuncConstructor类实例所需的代码,如下所示:

如果我们看一下为这个原型编译的代码(来自 LinqPad),我们可以看到它创建了另一个方法,它是函数委托的主体,然后将指向该方法的指针作为构造函数参数传递。

问题是如何使用类来做到这一点DynamicMethod?我需要创建一个新的匿名方法,也<DynamicMethodPrototype>b__0:就是我可以将对该方法的引用传递给ClassWithFuncConstructor类的构造函数。

这甚至可能与DynamicMethod班级有关吗?

0 投票
1 回答
632 浏览

grails - Grails addTo 和 removeFrom 动态方法性能

我一直在使用 Grails addTo 和 removeFrom 动态方法,它们很棒,通常我以下列方式使用它们

作为一个曾经在 java 上工作的人,我将这段代码可视化为以下三个步骤

  1. 运行选择查询以获取 quizInstance
  2. 运行选择查询以获取问题
  3. 运行插入查询以在 QUIZ_QUESTION 表中插入问题

我确实看到第三步只需要 quiz id 和 Question id 然后为什么要执行前两个步骤。是否有一种“addTo”类型的静态方法,我可以用Quiz.addToQuestionAndQuiz(questionId,QuizId) 来说如果我假设事情将在数据库方面进行的方式有误,请纠正我。

还有一种方法可以直接使用 addTo 方法添加值列表,还是必须使用 for 循环?

0 投票
1 回答
70 浏览

.net - 向 CLR 的 DynamicMethod 添加状态的最简单方法是什么?

我正在使用 DynamicMethod 进行一些代码生成,我有一个问题可以通过添加一个小状态来轻松解决,比如一个字段。不幸的是,我无法将此状态推送到方法的参数之一中,所以我基本上需要关闭像这个小 lambda 这样的本地:

最简单的方法是什么?

0 投票
0 回答
124 浏览

c# - MSTest 爬取网站的动态方法

我正在尝试创建一个 MSTest 来抓取网站。我希望它是动态的,所以我可以将它投入到我们任何网站的构建中。这基本上是在推送到暂存环境之前进行测试的一个步骤。它检查断开的链接和丢失的资源。我们的单元测试目前在 MSTest 中完成。我们正在使用 Bamboo 进行自动化构建和测试。它有一个很好的结果格式。我希望能够将每个项目视为带有详细信息的测试。这本身就很容易。我拥有抓取网站所需的所有代码。

如何动态创建具有属性 TestMethod 的方法并将其包含在测试中?眼下,我要找的四类资源都有一个测试方法,所以有四种测试方法。我想测试每个独特项目的方法。

我一直在研究 DynamicMethod,但我认为这不会让我到达我想去的地方。

0 投票
2 回答
3935 浏览

c# - DynamicMethod is much slower than compiled IL function

I wrote a simple object copier that copies public properties. I can't figure out why the Dynamic method is a lot slower than the c# version.

Durations

C# method : 4,963 ms

Dynamic method : 19,924 ms

Note that - as I run the dynamic method before starting the stopwatch - the duration do not include the compilation phase. I run that in Debug and Release mode, in x86 and x64 mode, and from VS and from the command line with roughly the same result (dynamic method is 400% slower).

From what I can debug the two methods have the same IL code.

I applogize if you read this twice. I posted this originally in: http://www.codeproject.com/Answers/494714/Can-27tplusfigureplusoutpluswhyplusthisplusDynamic but did not get all the answers I hoped.

edited 17 nov 2012 15:11:

0 投票
2 回答
667 浏览

.net - 是否可以将 Reflection.Emit 用于操作码 stelem.any 和 ldelem.any?

所以,我最近做了一些实验,发现 Reflection.Emit 似乎并不支持 ECMA 规范中的所有操作码。缺少 3 个操作码:

  • ldelem.any
  • stelem.any
  • no.(字首)

反射 API 是否不支持这些操作码,或者有什么方法可以生成它们?

0 投票
1 回答
444 浏览

vb.net - 动态方法访问冲突,仅在运行 32 位时

我有以下代码用于创建动态方法来调用我的 VB.net 应用程序中的属性的 Set 方法,使用 .NET 3.5(无法切换到 Lambda 表达式样式)。使用此处发布的示例,我添加了该函数,因为它不适用于Int64属性,主要是如果使用常规调用它int,取消装箱操作会导致 Invalid Cast 错误。所以我添加了代码来处理这个问题,但现在我遇到了一个新问题。在 64 位下运行时一切正常,但是一旦我更改为 32 位进程,调用委托的Int64属性会导致AccessViolationException, 尝试读取或写入受保护的内存。其他类型,如字符串,似乎工作正常。请参阅下面的代码,我做错了什么?