问题标签 [reflection.emit]

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 投票
6 回答
8867 浏览

c# - 生成动态方法来设置结构的字段而不是使用反射

假设我有以下代码更新struct使用反射的字段。由于结构实例被复制到DynamicUpdate方法中,因此在传递之前需要将其装箱到对象中

代码工作正常。现在,假设我不想使用反射,因为它很慢。相反,我想生成一些直接修改id字段的 CIL 并将该 CIL 转换为可重用的委托(例如,使用动态方法功能)。特别是,我想用 s/t 替换上面的代码,如下所示:


我的问题:有没有办法CreateSetIdDelegate通过使用以下技术之一来实现例外?

  1. 生成使用反射调用设置器的 CIL(作为本文中的第一个代码段)。这是没有意义的,因为要求是摆脱反射,但这是一种可能的实现,所以我只提一下。
  2. 不要使用Action<object, object>,而是使用签名为 的自定义委托public delegate void Setter(ref object target, object value)
  3. 而不是使用Action<object, object>,使用Action<object[], object>数组的第一个元素作为目标对象。

我不喜欢 2 和 3 的原因是因为我不想为 object 的 setter 和 struct 的 setter 使用不同的委托(也不想让 set-object-field 委托比必要的更复杂,例如Action<object, object>)。我认为CreateSetIdDelegate根据目标类型是结构还是对象,实现会生成不同的 CIL,但我希望它返回向用户提供相同 API 的相同委托。

0 投票
1 回答
126 浏览

c# - 两个 TypeBuilders 互相调用是非法的?

我正在生成(使用 System.Reflection.Emit)两种类型:称它们为 foo、bar。关键是,foo 实例化并调用 bar,而 bar 使用 foo。

创建 bar 时一切正常,但是当我开始生成 foo 时,我得到 typeloadexception 说找不到类型 foo。当我尝试将构造函数定位到 bar 时,它会发生(可能,因为错误是模糊的),它的参数之一是 foo。

当 bar 是 foo 中的嵌套类型时,此方法有效。

所以我的问题是 - 让两种类型像这样互相调用是非法的,还是我做错了?

0 投票
1 回答
2899 浏览

c# - 好奇心:为什么 Expression<...> 在编译时比最小的 DynamicMethod 运行得更快?

我目前正在做一些最后的优化,主要是为了好玩和学习,并发现了一些让我有几个问题的东西。

首先,问题:

  1. 当我通过使用DynamicMethod构造内存中的方法并使用调试器时,在反汇编视图中查看代码时,有什么方法可以让我进入生成的汇编代码?调试器似乎只是为我跳过了整个方法
  2. 或者,如果这不可能,我是否可以以某种方式将生成的 IL 代码作为程序集保存到磁盘,以便我可以使用Reflector检查它?
  3. 为什么Expression<...>我的简单加法版本 (Int32+Int32 => Int32) 比最小的 DynamicMethod 版本运行得更快?

这是一个简短而完整的演示程序。在我的系统上,输出是:

我希望 lambda 和方法调用具有更高的值,但 DynamicMethod 版本始终慢约 30-50%(可能由于 Windows 和其他程序而有所不同)。有人知道原因吗?

这是程序:

0 投票
1 回答
872 浏览

.net - 当属性类型为 Int64 时 DynamicMethod 返回不正确的值

我正在研究一个使用 DynamicMethod 从对象中检索值的例程。它适用于大多数数据类型,除了 DateTime.Ticks,它是 int64

在以下测试应用程序中。我同时使用 MethodInfo 和 DynamicMethod,methodInfo 返回正确的值,但 DynamicMethod 没有。有任何想法吗?

0 投票
2 回答
1292 浏览

.net - 是否可以反映正在运行的 .NET 进程?

我有一个在运行时发出动态类型的应用程序。为了检查生成的 .NET 代码,我们保存动态生成的程序集并使用反射器。

我想知道是否有办法在各自的进程运行时以反射器方式反映它们,而不必保存动态程序集?换句话说,在反射器中有一种“附加到进程...”按钮。

谢谢。

编辑:该功能的唯一存在理由是反映动态生成的程序集。

0 投票
2 回答
2145 浏览

.net - 紧凑框架的 Reflection.Emit 的替代方案

.NET CF 似乎缺少非常有用的 Reflection.Emit。到目前为止,我找到了这个库作为替代方案:http: //www.codeplex.com/EmitCF

但是它似乎是一个废弃的早期版本,所以我正在寻找更多选择。

有人知道 Emit 的另一种选择吗?或者也许有人使用了 EmitCF 并且可以评论它的状态?

顺便说一句,更大的图景:我正在尝试为 CF 获取 Emit,以便我可以让http://dynamic.codeplex.com在 CF 下工作,所以我可以优化我正在使用的序列化代码(http ://www.codeproject.com/KB/XML/GR_CustomXmlSerializer.aspx )

0 投票
1 回答
888 浏览

reflection.emit - Reflection.Emit 动态创建方法

我想动态创建一些方法,它将接受单个参数 - 类 A 的实例,然后将在传递的 A 实例中执行方法 B。B 具有 int 类型的参数。所以这里是架构:

这是我尝试过的:

但是编译器告诉我 CLR 没有找到该方法。你能帮我吗?

0 投票
1 回答
5214 浏览

boolean - ILGenerator:如何将布尔值添加到堆栈中

这是我可以将浮点值放入堆栈的方式(在 C# 中):

如何使用 Emit 方法将布尔值放入堆栈?

0 投票
1 回答
2714 浏览

c# - Reflection.Emit 通用基类通用方法调用

我正在动态地对具有泛型方法的泛型类型(填充它的合同)进行子类化。我尝试调用此通用方法,但我生成的程序集有错误。尝试打开程序集时反射器崩溃,并且此代码段未运行。

我得到的例外是:

试图加载格式不正确的程序。(来自 HRESULT 的异常:0x8007000B)

任何帮助,将不胜感激。我将安装 PEVerify 以查看生成的代码。

0 投票
1 回答
135 浏览

.net - PEVerify 警告参数乱序

我已经使用 Reflection.Emit 构建了一个程序集。运行 PEVerify 返回 214 个相同类型的警告:

不幸的是,没有太多关于这类问题的文档。

我猜是因为它是一个元数据警告,它与方法名称、参数名称、类名称、方法签名或类似名称有关。将其与我的代码相关联的唯一方法是警告的数量,这是我将尝试继续进行的。

任何帮助或见解将不胜感激。