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

c# - Reflection.Emit 比 GetValue 和 SetValue 更好:S

我被告知使用 Reflection.Emit 而不是 PropertyInfo.GetValue / SetValue,因为这样更快。但我真的不知道 Reflection.Emit 中的哪些内容以及如何使用它来替代 GetValue 和 SetValue。有人可以帮我吗?

0 投票
2 回答
4321 浏览

c# - IL Emit 用于调用委托实例?

基本上,我接受事件名称作为字符串,以获取EventInfo. 然后,我使用反射发现事件处理程序类型和事件参数类型,创建该类型的新委托 ( myEventHandler),并将其与事件挂钩。每当myEventHandler被调用时,我需要向下转换并将参数传递给处理程序。

我的代码如下。myEventHandler当调用“d”时,需要通过 调用“处理程序” 。我需要在放置 ??? 的地方放一些反射发射代码。有什么想法吗?

编辑:基于通过反射器的观察。

手动编码场景的反射器生成代码是

这就是我基于此尝试的。

但这会导致运行时错误:

'调用约定必须是可变参数'

可能我错过了一些东西,需要更好地了解 IL。

0 投票
1 回答
8466 浏览

c# - 如何使用反射.emit 发出显式接口实现?

观察以下简单的源代码:

下面是使用 Reflector 反编译 A.dll 程序集获得的等效 C# 代码:

现在,如果我希望该MyType类型显式地实现IMyInterface接口怎么办?所以我采取这些措施:

并切换注释以产生此代码:

但是现在,应用程序无法创建动态类型。这一行:

抛出以下异常:

谁能告诉我我的代码有什么问题?

谢谢。

0 投票
5 回答
168 浏览

.net - 是否可以从 F(Type) 过渡到 F没有反思也没有字典?

首先,稍微介绍一下。

我必须发挥作用:

我希望调用F1(Type),它又应该转换到与给定类型参数相关的泛型上下文并调用泛型对应项F2<T>

一个简单的实现将是一个简单的反射,就像这样(为了清楚起见,我省略了绑定标志):

一个更高级的实现将存储 F2 的打开方法信息 -typeof(C).GetMethod("F2")除了,但它仍然基本上是同一件事。

如果F1被多次调用并且我们希望提高性能,那么“市场上”的标准解决方案采用字典和Delegate.CreateDelegate方法,如下所示:

现在回答我的问题。是否有可能完全消除字典?

例如,通过使用 Reflection.Emit 发出一些奇特的函数,该函数将接收 Type 实例和 F2MethodInfo 并在没有和字典的情况下进行内部转换?这个奇特的函数应该只发出一次并且适用于任何给定的类型。我想知道是否可以通过这种方式消除任何类型的缓存映射类型到委托。

谢谢。

编辑

为了讨论方便,让我们假设花哨的发出函数知道它应该调用 F2,这意味着它不必接收其方法信息。那么有可能放弃字典吗?

0 投票
2 回答
440 浏览

linq - 紧凑框架的 ILASM?

我在 Compact Framework 上使用 Linq 表达式树(来自 db4o/Mainsoft/Mono 端口)。由于 System.Reflection.Emit 不存在,我无法将我的 LambdaExpressions 编译为委托,出于性能原因我想这样做。

我想也许我可以将我的表达式树转换为 IL 并基本上以这种方式提供缺少的 Emit 功能,但后来我意识到我必须在其上运行基于 WinCE 的 ILASM 或编写我自己的 PE 标头和汇编元数据。

我更希望 ILASM 可用。是吗?

0 投票
3 回答
2627 浏览

c# - 动态创建类型的性能

使用 C#,我注意到在使用动态生成类型的实例与简单结构填充列表时性能存在显着差异。下面的代码包括 4 种不同的方法来填充 100,000 个对象的列表。

每种方法的执行方式不同:

按钮 1:15 毫秒

按钮 2:31 毫秒

按钮 3 和 4:300 毫秒

请注意,按钮 3 和 4 的代码来自此主题

谁能解释为什么动态创建的对象更慢?

0 投票
1 回答
221 浏览

.net - 反射 IL 代码

我是反射的新手。我需要创建一个继承自父类的类。我需要创建一个只读属性。此属性通过传递参数 25 调用父类中的现有函数。

一切正常,除了我无法将值 25 传递给被调用的函数。下面是生成类的代码。请协助。谢谢。

0 投票
4 回答
5388 浏览

c# - 使用委托调用构造函数

我发现了这个,但尝试使用它并失败了。

如何使用反射创建对象并通过将其放入委托中使其快速?

在将它放入委托之前,我尝试至少调用它,当我在上面这样做时,我得到了错误

附加信息:调用的目标已引发异常。

如果我调用 d() 而不是我得到异常

我如何将无参数构造函数放入委托并调用它?

0 投票
2 回答
2092 浏览

c# - C# 反射:向现有程序集发射类

是否可以使用 Reflection.Emit 在现有程序集中创建类型,或者您是否需要定义新的动态程序集才能包含动态类型?

基本上,我打算读入一个 XML 定义文件,该文件定义了一个类,该类随后被多次实例化并填充了来自其他几个 XML 文件的数据。冲洗并重复几个文件夹(每个文件夹都有不同的定义文件)。

我还打算使用这些数据来动态构建我的应用程序的界面,并在将数据重新保存到 XML 文件时定义数据的格式。

0 投票
1 回答
189 浏览

c# - 如何使用 IL Emit 定义相互引用的两种类型

我需要使用反射 Emit 来定义类似的东西:

难点是在调用TypeBuilder.DefineProperty()时,需要传递属性返回值的System.Type,目前还不存在。如果引用只用一种方式,那会很容易,但是两种方式都会导致鸡和蛋的问题。

我希望找到一个采用 TypeBuilder 而不是 Type 的重载,这可以让我同时定义两个类,然后在最后调用 TypeBuilder.CreateType()。但我没有看到这样的事情。

解决这个问题的正确方法是什么?