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

c# - ILGenerator 有一个好的包装器吗?

我现在使用 System.Reflection.Emit 有一段时间了,发现它(谁没有?)和容易出错一样痛苦。

你知道 IL 生成器周围是否有一个很好的包装器,我可以依靠它以比直接使用 SRE 更安全、更容易的方式发出 IL?

编辑:

我知道操作表达式树肯定比直接发出 IL 更容易、更安全,但它们现在也有一些限制。我不能创建代码块、使用循环、声明和使用几个本地人等等。我们需要等到 .NET 4 出来:)

此外,我正在处理一个已经依赖于 SRE 的代码库。

显然,ILGenerator 做了我需要的一切。但是在操作它时,我会很感激更多的帮助。当我提到 ILGenerator 包装器时,它仍然处于相当低的级别,我想到了一些可以提供以下方法的方法:

这确实是 3 个幼稚的例子,但足以证明我的期望。我们可以将其视为一组扩展方法,但最好支持条件语句和循环,如RunSharp。事实上,RunSharp 与我想要的非常接近,但它过多地抽象了 ILGenerator 并且没有公开其所有功能。

我不记得在哪里了,但是我已经在一个开源项目中看到过这样的助手。

0 投票
1 回答
612 浏览

.net - 是否有任何陷阱或充分的理由不使用 autosproc 进行存储过程调用?

我已经实现了一个数据访问层,它使用第三种猴子方法(http://www.codeproject.com/KB/database/DynamicMethod_ILGenerator.aspx)的变体从数据读取器填充通用实体。这工作得很好,执行得很好,并且节省了我为数据检索编写大量重复代码的时间。

现在我想添加采用通用实体的方法并将其转换为参数列表以提供给存储过程,这样我就可以将数据持久性添加到猴子的技巧集合中。

我在以下位置找到了一些指导:http: //msdn.microsoft.com/en-us/library/ms973259.aspx和 autosproc 解决方案中的一些示例代码。它在纸上看起来不错,我打算将其合并,但快速的谷歌并没有在实现 autosproc 的用户体验方面出现太多,我正在寻找任何去过那里并做过的人的竖起大拇指(或向下)已经。

那么,您是否使用过 autosproc?它对你有用吗?性能或其他方面是否存在任何使其不适合企业应用程序的巨大缺陷?

建议表示赞赏。

0 投票
2 回答
3541 浏览

c# - 使用 DynamicMethod 和 ILGenerator 在 C# 中生成动态事件

我需要在运行时基于 EventInfo 对象生成一个事件处理程序,并在该事件处理程序中调用一个方法。类似于以下内容:

我需要帮助来生成注释部分的 IL 代码。

0 投票
2 回答
7174 浏览

c# - 动态对象属性填充器(无反射)

我想以类似于CodeProject 上的 DynamicBuilder的方式填充对象的属性而不使用反射。CodeProject 示例专为使用 DataReader 或 DataRecord 填充实体而设计。我在几个 DAL 中使用它以获得良好的效果。现在我想修改它以使用字典或其他与数据无关的对象,以便我可以在非 DAL 代码中使用它——我目前使用反射的地方。我对 OpCodes 和 IL 几乎一无所知。我只知道它运作良好并且比反射更快。

我试图修改 CodeProject 示例,但由于我对 IL 的无知,我被困在了两条线上。

  • 其中一个处理 dbnulls,我很确定我可以丢失它,但我不知道它之前和之后的行是否相关以及它们中的哪些也需要删除。
  • 我认为,另一个是以前从数据记录中提取值的那个,现在需要将其从字典中提取出来。我想我可以用我的“property.Value”替换“getValueMethod”,但我不确定。

我也愿意为这只猫剥皮的替代/更好的方法。

这是到目前为止的代码(注释掉的行是我坚持的行):

编辑:

使用 Marc Gravell 的 PropertyDescriptor 实现(使用 HyperDescriptor),代码被简化了一百倍。我现在有以下测试:

欢迎对 TypeDescriptor.GetProperties() 和 PropertyDescriptor.SetValue() 的性能注意事项发表任何评论...

0 投票
2 回答
809 浏览

c# - 转换 C# 代码

我需要在 C# 代码(使用 ilGenerator.Emit)中模拟以下函数

有谁能够帮我?

0 投票
2 回答
1036 浏览

c# - 使用 Reflection.Emit 发出“使用 (x) { ... }” 块?

我正在尝试在 C# 中使用 Reflection.Emit 来发出一个using (x) { ... }块。

在我在代码中,我需要获取堆栈的当前顶部,这是一个实现 IDisposable 的对象,将其存储在局部变量中,在该变量上实现一个 using 块,然后在其中添加更多代码(我可以处理最后一部分。)

这是我尝试在 Reflector 中编译和查看的示例 C# 代码:

这在反射器中看起来像这样:

当使用 Reflection.Emit 时,我不知道如何处理最后的“.try ...”部分。

有人可以指出我正确的方向吗?


编辑:通过电子邮件询问代码后,我将在此处发布我的流畅界面代码,但除非您获取我的一些类库,否则它对任何人都没有多大用处,这也是一些代码。我正在努力处理的代码是我的 IoC 项目的一部分,我需要生成一个类来实现对服务的方法调用的自动记录,基本上是一个用于自动生成代码的服务的装饰器类。

实现所有接口方法的方法的主循环是这样的:

EmitUsing 吐出 Jon 回答的 BeginExceptionBlock,所以这就是我需要知道的。

以上代码来自LoggingDecorator.cs,IL 扩展主要在ILGeneratorExtensions.Designer.cs中,其他文件在LVK.Reflection命名空间中。

0 投票
1 回答
410 浏览

.net - 为什么需要在 CIL 方法中将每个参数加载到堆栈中?

在我的应用程序中,我需要动态创建一个包含多个属性的类型。我知道在这种情况下,必须使用 ILGenerator 为属性的 getter 和 setter 方法生成 CIL。

通过反复试验,我终于得到了以下代码,它为我生成了一个 setter 方法:

该代码运行良好,但有一点我不明白。为什么需要调用“Ldarg_0”指令?

我知道它指的是方法的隐式第一个参数,即“this”引用,因此设置器的实际值存储在第二个参数中。我认为只调用 Ldarg_1 指令就足够了,这会将第二个参数推入堆栈(最后,在设置器中,我不需要检查“this”引用,所以我不需要用它做任何事情),但是当我尝试设置属性的值时,这会导致 TargetInvocationException 被抛出。

谢谢!

0 投票
4 回答
3977 浏览

c# - 在 ILGenerator 的堆栈顶部放置一个对象

我必须将一个对象的实例传递给一个函数,所以显然所有要作为参数的信息都将加载到评估堆栈中 这是我正在寻找的代码

我不需要存储在类中的任何信息只是类型,我不能使用任何原始类型来做出决定

最后我读到我可以使用指针来使用一些操作码加载类型......但我在这里完全迷失了,任何帮助或指向正确方向的指针都会很棒:)

[更新]

好吧,我找到了我自己的问题的答案,尝试了它,它工作不知道它是否是正确的方法,但我可以成功地创建一个对象并将其加载到堆栈中并将它传递给一个函数

SomeFunctionMethodInfo 是一个以 Object 作为参数的函数,我已成功地将对象传递给函数,并且还可以对其进行操作并将类作为对象返回。

我在任何地方都找不到对这个例子的引用,只是通过 MSDN 弄清楚了,我做错了什么还是有什么缺点?如果您可以纠正它或提供更好的答案,请专家

0 投票
1 回答
364 浏览

c# - microsoft ILGenerator 的输出文件在哪里?

我使用过 Microsoft ILGenerator 及其 Emit 成员。我想知道在哪里可以找到它生成的输出 il 文件。

0 投票
2 回答
5625 浏览

c# - 为什么 Calli 比代表调用更快?

我在玩 Reflection.Emit 并发现了关于很少使用的EmitCalli. 很感兴趣,我想知道它是否与常规方法调用有什么不同,所以我整理了以下代码:

我在 x86 模式和 x64 模式下运行代码。结果?

32 位:

  • 代表版本:994
  • 愈伤组织版本:46

64 位:

  • 代表版本:326
  • 愈伤组织版本:83

我想这个问题现在很明显......为什么会有如此巨大的速度差异?


更新:

我还创建了一个 64 位 P/Invoke 版本:

  • 代表版本:284
  • 愈伤组织版本:77
  • P/Invoke 版本:31

显然,P/Invoke 更快......这是我的基准测试的问题,还是我不明白发生了什么?(顺便说一句,我处于发布模式。)