问题标签 [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 回答
1550 浏览

c# - 自修改 C# (MSIL) 代码?

如何使用 C#/.NET 动态修改内存中的 MSIL 代码?

是的,我真的很想替换已经在内存中的现有代码。
具体来说,我不是

  • 只希望生成代码(通过表达式模板、ILGenerator 等)
  • 尝试发出一个新的二进制模块,希望稍后将其加载到内存中
0 投票
1 回答
394 浏览

c# - 如何在 IL 代码中发出三元运算符

我正在尝试生成动态方法。假设我arg在堆栈中有布尔值。我想调用一个接受类型参数的方法,该参数将通过简单的规则int从该值转换。对于一些示例代码,生成的 IL 代码如下:boolarg ? 1 : 0

发射时OpCodes.Brtrue_SOpCodes.Br_S如何正确识别要跳转到的偏移量?

0 投票
5 回答
1396 浏览

c# - 如何使用 IL 改变盒装结构

想象一下我们有一个可变的struct(是的,不要开始):

使用反射,我们可以获取 this 的盒​​装实例struct并在盒内对其进行变异:

想做的是编写一些可以与此相同但更快的IL。我是一个元编程迷;p

使用常规 IL 对任何值进行拆箱并改变值是微不足道的 - 但您不能只是在之后调用 box 它,因为这会创建一个不同的盒子。我我们需要在这里做的是将它复制到现有的盒子上。我已经调查过ldobj/ stobj,但那些似乎并没有完成这项工作(除非我遗漏了一些东西)。

那么:是否存在这样做的机制?还是我必须将自己限制在反射以执行 boxed s 的就地更新struct

或者换句话说:什么... evil goes here...

0 投票
1 回答
489 浏览

.net - 如何从单例调用实例方法与发射

我有例外:操作可能会破坏运行时,我不知道为什么:(。请帮助我。

我添加了本地,但仍然无法正常工作...

方法要动态创建(REF000001):

这是类,我想从单例中调用方法。

从 ILDASM 返回:

我的带有 IL 生成器抛出异常操作的代码可能会破坏运行时的稳定性

0 投票
1 回答
372 浏览

c# - ILGenerator 属性不是实例

我想得到这个:

但我得到了这个:

为什么我得到“.property class class”而不是“.property instance class”?这是我用来生成它的内容:

0 投票
1 回答
912 浏览

c# - 公共语言运行时检测到无效程序 - ILGenerator

基本上我试图将字节数组内的数据反序列化为对象。我正在尝试使用 UTF8 编码的 GetString 方法来读取字符串。这是我的代码的一部分:

我在这段代码之外检查了“getstring”的方法签名,它可以工作。我尝试删除'.boxIfAny',我也尝试使用'call'而不是'callvirt'。据我了解,“callvirt”是适用于这种情况的实例方法。有任何想法吗?

0 投票
3 回答
751 浏览

c# - 如何使用 ILGenerator 使用 VarArgs 生成对基本构造函数的调用

如果我反编译 Test2 构造函数:

我得到这个 IL:

我正在尝试使用 ILGenerator 生成相同的 IL 流,但EmitCall仅采用 MethodInfo 而不是 ConstructorInfo 并且唯一采用 ConstructorInfo 的Emit重载不支持传入其他参数类型。

0 投票
1 回答
795 浏览

c# - 如何发出调用动态方法的代码?

我正在尝试发出调用我之前发出的动态方法的代码:

它通过一个异常说:“MethodInfo 必须是运行时 MethodInfo 对象”

有没有办法将动态方法转换为运行时方法?

0 投票
2 回答
1201 浏览

c# - 使用 ILGenerator.Emit 设置对象的子属性

我有一些代码使用 IlGenerator.Emit 使用数据读取器创建和填充通用对象。它很好用,但是当数据库字段名称包含下划线时,我需要扩展它以填充简单的子对象。

例如,名为“Address_Line1”的数据库字段应填充属性 Line1,它是实体上地址属性的属性。在 C# 代码中,基本上......

我尝试编写 c# 代码并使用 ILSpy 尝试识别我应该编写的 IL 代码,但我不断收到内存错误等。

下面的代码包括当前工作的 IL 代码,并且我已经在我的代码尝试中包含了注释。谁能帮我吗?

0 投票
1 回答
736 浏览

c# - 为什么 ILGenerator 在 Foreach 语句中插入 Leave 指令

我生成以下代码:

直通Emit

这是完整的代码:

这是结果 IL(请参阅IL_001f):

您能否澄清为什么leave会出现指令?