问题标签 [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 投票
2 回答
3159 浏览

.net - 如何通过 ILGenerator.Emit* 调用“正常”方法?

DynamicMethod 是否可以调用(例如通过 ILGenerator.EmitCall 或类似方法)“正常”方法,例如 Private Sub BlahBlah(ByVal obj as Object)?

提前致谢

0 投票
1 回答
710 浏览

cil - 使用 System.Reflection.Emit.ILGenerator 在 VB.Net 中调用 Random?

我正在用我自己的语言为 .Net 可执行文件生成输出......从我的语言翻译的操作码(称为“随机”)应该在特定范围内创建一个随机数。

我的代码的目标是使用 System.Reflection.Emit.ILGenerator 类生成随机数...以了解 CIL 代码的外观我创建了一些 vb.net 代码:

ILDASM 报告为:

我可以使用 ILGenerator.Emit 方法重现所有内容;除了行 IL_0001 ("newobj instance void [mscorlib]System.Random::.ctor()")...

希望我没有用太多信息压倒任何人。但我认为在描述一个对我来说似乎很复杂的问题时,最好是冗长的。

最后,我得到了迄今为​​止生成的代码:

它发出以下代码:

我已经尝试过的事情

  • 想出一种方法来指出 IL_Gen.Emit(OpCodes.NewObj, ... ctor())... 无法弄清楚如何。

  • 想出一种指向 New() 的方法 - 因为这似乎是 .ctor() 是什么...... New 只能用作初始化程序。

  • 只是禁用 Random 功能,直到我想出更好的发射方式。

这个问题对我来说似乎很难,但我知道有人比我更容易理解代码生成和 MSIL,并且愿意指出答案。

谢谢你的时间,

多米尼克

0 投票
1 回答
493 浏览

ilgenerator - ILGenerator,判断返回值为 null

调用此函数,并在特殊情况下提供返回值“null”。

如果该值为空,我必须决定是否跳到标签上

在方法调用之后使用

给我一个例外“JIT 编译器遇到内部限制。” 当我调用该函数时,代码会正确构建。

也尝试过 OpCodes.Brfalse。

我究竟做错了什么 ?

0 投票
1 回答
93 浏览

.net - 一个简单的 Pop 然后重新加载不起作用

在调用返回一个的函数后object,我尝试将堆栈中的值存储在局部变量中,然后将其推回,但它失败并出现异常

以调用目标引发异常

代码如下:

如果我删除Stloc_3并且Ldloc_3一切正常,我就会迷失在这里。

0 投票
1 回答
1721 浏览

reflection - IL 生成器。这段代码有什么问题

我正在尝试构建一个动态属性访问器。想要一些非常快接近调用实际属性的东西。不想走反射路线,因为它非常慢。所以我选择使用 DynamicAssembly 并使用 ILGenerator 注入 IL。下面是似乎工作的 ILGenerator 相关代码

所以上面得到第一个参数,它是包含属性的对象。方法集合包含嵌套属性(如果有)。对于每个属性,我使用 EmitCall 将值放在堆栈上,然后我尝试将其装箱。这就像一个魅力。

唯一的问题是如果您有像 Order.Instrument.Symbol.Name 这样的属性并假设 Instrument 对象为空。然后代码将抛出一个空对象异常。

所以这就是我所做的,我引入了一个空检查

现在这段代码打破了说对象/内存已损坏等。那么这段代码到底有什么问题。我在这里错过了什么吗?

提前致谢。

0 投票
4 回答
2162 浏览

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

我正在尝试编写一个用于从任意事件触发对方法的调用的类,但我被困住了,因为我根本无法从发出的 MSIL 代码中找到引用“this”的方法。

这个例子应该描述我在找什么:

这是我设想使用的类的示例:

(请注意,上面的例子毫无意义。我只是试图描述我在寻找什么。我的最终目标是能够在任意事件触发时触发对任意方法的调用。我将使用它在一个 WPF 项目中,我尝试使用 100% MVVM,但我偶然发现了其中一个 [看似] 经典的断点。)

无论如何,只要代码在任意事件触发时成功调用“invokedMethod”,但“this”似乎是一个空对象(_parameter 始终为空),就“工作”。我已经做了一些研究,但根本找不到任何好的例子,其中“this”被正确地传递给从这样的动态方法中调用的方法。

我发现的最接近的示例是THIS ARTICLE但在该示例中,“this”可以强制使用动态方法,因为它是从代码调用的,而不是任意事件处理程序。

任何建议或提示将不胜感激。

0 投票
1 回答
640 浏览

c# - ILGenerator:如何使用非托管指针?(我得到一个验证异常)

我正在制作一个声音合成程序,用户可以在其中创建自己的声音,进行基于节点的合成、创建振荡器、滤波器等。

该程序将节点编译为一种中间语言,然后通过 ILGenerator 和 DynamicMethod 将其转换为 MSIL。

它适用于存储所有操作和数据的数组,但如果我能够使用指针允许我稍后执行一些位级操作,它会更快。

PD:速度很重要!

我注意到一个DynamicMethod构造函数覆盖有一个方法属性,其中一个是UnsafeExport,但我不能使用它,因为唯一有效的组合是Public+Static

这就是我正在尝试做的事情,它会抛出一个 VerificationException:(只是为指针分配一个值)

0 投票
3 回答
1385 浏览

.net - ILGenerator 方法内联

给定以下代码:

对方法 Do 的调用被内联。循环在大约 40 毫秒内完成。例如,如果我将 Do 设为虚函数,它不会被内联,并且循环在 240 毫秒内完成。到目前为止,一切都很好。当我使用 ILGenerator 生成 Do 方法(Echo),然后使用与给定 main 方法相同的循环生成 DynamicMethod 时,对 Echo 方法的调用永远不会内联,并且循环完成大约需要 240 毫秒。MSIL 代码是正确的,因为它返回与 C# 代码相同的结果。我确信方法内联是由 JIT 完成的,所以我认为没有理由不内联 Echo 方法。

有谁知道为什么这个简单的方法不会被 JIT 内联。

0 投票
2 回答
1633 浏览

c# - ILGenerator 捕捉异常不起作用

我正在使用System.Reflection.Emit. 在某一时刻,原始对象可能在访问 ( FaultException) 时抛出错误,并且我已经实现的 my 应该捕获该错误try { } catch (Exception e) { },但事实并非如此。

代码由ILSpy 正确显示。

代码生成

这是程序集生成的代码。

编辑

异常被用户代码而不是 IL 代码捕获。

拆卸

在这里删除了客户的一些命名空间。写入行已在最后几分钟添加。

编辑 2

System.Exception在 IL 代码中抛出 a时,在FaultException'1可能发生之前,会处理异常。用Exception和测试ArgumentException

0 投票
2 回答
1190 浏览

c# - 从 ILGenerator 检索代码

我已经编写了一些函数来使用 ILGenerator 创建一个 exe 文件。我想要向用户展示不使用 ILDasm 或 Reflector 等外部工具生成的 IL 语言。

在我的程序执行期间,我已将每个 OpCode 添加到 ILGenerator,因此我可以使用带有 OpCode 表示的字符串将每个 OpCode 保存在一个列表中,但我希望直接获取 IL 代码。可以做到吗?

重要提示:我使用的是 Mono 2.6。