问题标签 [ilgenerator]

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 投票
1 回答
1329 浏览

c# - 有没有办法查看生成的 DynamicMethod 的 IL 代码(在 Sigil 中)?

我正在使用Sigil创建一个DynamicMethod并希望查看生成的 IL。

我以前从未合作过,DynamicMethods所以也许有一个非常明显的答案,但到目前为止我还没有找到任何东西。

这是一个类似的问题,但它已经很老了,我不知道链接工具是否适用于 VS2013 - 我想也许有更新的东西可用。将生成的方法存储在程序集中并将其写入磁盘可能是可行的,但这在开发过程中非常麻烦。

顺便说一句,我知道out string instructionsSigilCreateDelegate方法的参数,但这似乎不是“真正的”IL 代码(包含例如命名标签),我也不确定这是在 Sigil 优化之前还是之后。

编辑:正如@svick 建议的那样,我最终创建了一个动态程序集并将其写入磁盘。然后可以使用 来查看发出的方法的 IL ildasm。如果有人想做同样的事情,这是我使用的代码:

0 投票
1 回答
1098 浏览

c# - 如何根据IL动态编写带有Reflection.Emit的C#类

假设我们有一个接口:

计算逻辑是在javascript(实际上是TypeScript)代码中实现的,我们想使用Reflection.Emit动态创建以下实现,因此我们可以与C#实现共享单元测试:

我们可以从 IL DASM 获得 IL:

我们创建了 TypeCreator 来做到这一点:

像这样使用它:

它抛出一个异常:

来自程序集“MyAssyFor_ICalculator,版本=0.0.0.0,文化=中性,PublicKeyToken=null”的“Imp_ICalculator”类型中的方法“计算”没有实现。

有什么问题?

0 投票
1 回答
143 浏览

c# - 当泛型事件发生时调用方法

在尝试实现对应在运行时定义的事件触发的方法的调用时,我遇到了问题。我找到了这个答案:

从通用事件处理程序重定向到动态方法

并实现了该解决方案,但是当要调用的方法是实例而不是静态时,我不断收到异常。这是我的部分代码:

我找不到摆脱该异常的方法,如果我将SetFlag()方法设置为静态,则代码可以正常工作,但这不是我需要的。任何建议将不胜感激。提前致谢。

0 投票
1 回答
1735 浏览

c# - 如何使用 ILGenerator.Emit 调用字段上的方法?

我想知道如何myMethodilGenerator.

有人能帮我吗 ?

0 投票
1 回答
313 浏览

c# - 我可以在不使用 FieldInfo 的情况下使用 OpCodes.Ldsfld 吗?

我想避免使用 GetType 和 GetField。我可以在 Ldsfld 中使用字符串吗?我在下面包含了我要完成的工作的模型。如您所见,我是 IL Generation 的新手——我正在尝试消除我的应用程序中反射成本的一些成本。

0 投票
2 回答
391 浏览

.net - .maxstack 如何通过反射发射计算?

我正在生成一个具有大量 switch 语句的方法。我注意到 ildasm 中的 .maxstack 值非常高。我的理解是 .maxstack 是给定方法的最大堆栈深度?我找不到太多关于网上的信息。

在前两个示例中,最大堆栈大小超过 4KB。在最后一个示例中,最大堆栈大小为 509,但实际最大深度似乎为 10。为什么值这么高?这只是对 jit 的提示?拥有如此高的 .maxstack 是否有影响?我在互联网上读到的关于它是最大深度的所有内容都是不正确的吗?

更新

似乎我的第三个示例中有一个错误。我没有验证或测试,并且在加载参数之后有额外的推动。在我修复 maxstack 为 9 之后。对于前两个示例,使用反射.emit 时最大堆栈大小保持在 4K 以上。对于 C# 编译器,switch 方法是 9,而不是反射发射的 4502。

根据答案,似乎他们为每个基本块添加了最大深度作为总结,而 C# 编译器计算得更正确。尽管如此高的价值,我仍然对它的含义感到好奇。

// 错误,这导致堆栈大小非常高。// generator.Emit(OpCodes.Ldc_I4, index);

0 投票
1 回答
171 浏览

c# - 在 C# 反射中使用 IL 生成器在静态字段上调用方法

我正在从 C# 反射生成一个新的Type通孔。TypeBuilder我现在遇到的问题是如何构建方法体来调用静态字段上的方法。

现在我生成的(在运行时)类看起来像这样:

所以现在我正在生成这样的方法:

所以请告诉我如何在 Il 生成器的堆栈上加载静态字段,然后在其上调用某些方法。

0 投票
1 回答
281 浏览

c# - C# 在运行时自动生成方法回调?

我想将运行时方法绑定到类方法(如果我调用运行时方法,它必须调用我的类方法,带或不带参数和返回值)。

如果我没有在调用方法和回调方法上设置参数,我的代码可以工作,但是,如果我设置参数,我会收到错误:“给出错误参数计数不匹配。”:我该如何解决?

0 投票
0 回答
234 浏览

c# - IlGenerator 在投掷后发出离开

我正在通过 ilgenerator 生成一个方法,但我遇到了问题。IlGenerator.BeginCatchBlock()强制离开,在这种情况下它是无法到达的指令。

实际上,输出就像

我预计不会将 IL_0011 留在 .try 块中。PEVerify 没有显示错误。

0 投票
1 回答
485 浏览

c# - 让 DynamicMethod 调用其他方法

我希望能够通过传递事件的名称和依赖于客户端代码的操作来订阅任何对象的任何事件。我有以下代码

上面代码的用法:

当事件触发时,它会导致 InvalidProgramException。我知道这是一个棘手的问题,我可以简单地使用 += 订阅,但有人能说出我的代码崩溃的原因吗?我想 ILGenerator.Emit 有问题,有什么建议吗?