问题标签 [cil]

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 回答
1799 浏览

c# - 有没有办法计算执行的 IL 指令的数量?

我想对 C# 进程进行一些基准测试,但我不想将时间用作我的向量——我想计算在特定方法调用中执行的 IL 指令的数量。这可能吗?

编辑我不是指对方法体的静态分析——我指的是执行的实际指令数——因此,例如,如果方法体包括一个循环,则计数将增加多少指令up the loop * 循环迭代的次数。

0 投票
4 回答
1221 浏览

cil - CIL 堆栈交换指令

是否有 CIL 指令来交换堆栈中的前两个元素?

0 投票
6 回答
17885 浏览

.net - 呼叫和 Callvirt

CIL 指令“Call”和“Callvirt”有什么区别?

0 投票
3 回答
3696 浏览

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

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

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

编辑:

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

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

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

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

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

0 投票
3 回答
2804 浏览

c# - 如果在 .NET 中将事件实现为委托,那么 .event IL 部分的意义何在?

我在 Stack Overflow 上看到了一些关于委托、事件和这两个功能的 .NET 实现的非常好的问题。特别是一个问题,“ C# 事件如何在幕后工作? ”,产生了一个很好的答案,很好地解释了一些微妙的观点。

上述问题的答案说明了这一点:

当您声明类似字段的事件时......编译器会生成方法和私有字段(与委托的类型相同)。在类中,当您引用 ElementAddedEvent 时,您指的是该字段。在课堂之外,您指的是该领域

从同一问题(“ Field-like events ”)链接的 MSDN 文章补充说:

引发事件的概念完全等同于调用由事件表示的委托——因此,引发事件没有特殊的语言结构。

为了进一步检查,我构建了一个测试项目,以查看事件和委托编译到的 IL:

我希望委托字段handler和事件FooEvent编译成大致相同的 IL 代码,并使用一些额外的方法来包装对编译器生成的FooEvent字段的访问。但生成的 IL 并不完全符合我的预期:

由于事件只不过是编译器生成的委托addremove方法,我没想到会在 IL 中看到事件被视为更多。但是 add 和 remove 方法是在开头的部分中定义的.event,而不是.method像普通方法那样。

我的终极问题是:如果事件被简单地实现为具有访问器方法的委托,那么拥有.eventIL 部分的意义何在?如果没有这个,它们不能通过使用.method部分在 IL 中实现吗?.event相当于.method? _

0 投票
18 回答
48648 浏览

assembly - CIL nop 操作码的目的是什么?

我正在浏览 MSIL 并注意到 MSIL 中有很多nop指令。

MSDN 文章说,如果操作码被修补,它们不会执行任何操作并用于填充空间。它们在调试版本中的使用比在发布版本中更多。

我知道这些语句在汇编语言中用于对齐后面的指令,但是为什么 MSIL 中需要 MSIL nop 呢?

(编者注:接受的答案是关于机器代码 NOP,而不是问题最初询问的 MSIL/CIL NOP。)

0 投票
2 回答
508 浏览

asp.net - 自动 MSIL 到 JavaScript 的转换有用吗?

我一直在从事一个名为Axial的项目,该项目将 MSIL(已编译的 C# 或 VB.NET)转换为 JavaScript。有一些工作代码示例,但一些常见情况无法正常工作。(当前版本不能在生产模式下工作,SVN 代码不能在调试模式下工作,但更干净。)我从很多人那里听说他们讨厌编写 JavaScript,所以我知道这个项目有一些优点,但我猜这种态度在 SO 社区中并不那么普遍。

假设产品完美流畅地运行,那么您的 JavaScript 100% 的时间都可以正常工作,并且 Visual Studio 插件可确保您正确使用产品。这是您或您的组织会使用的东西吗?除了直接代码翻译之外,您还会对哪些功能感兴趣?

0 投票
3 回答
1858 浏览

c# - 调用基类的事件处理程序的 MSIL 是什么?

我有一个名为 EventConsumer 的类,它定义了一个事件 EventConsumed 和一个方法 OnEventConsumed,如下所示:

我需要在 OnEventConsumed 运行时添加属性,所以我使用 System.Reflection.Emit 生成一个子类。我想要的是与此等效的 MSIL:

我到目前为止是这样的:

我创建类型,创建类型的实例,并调用它的 OnEventConsumed 函数,然后我得到:

...这并不完全有帮助。我究竟做错了什么?调用基类的事件处理程序的正确 MSIL 是什么?

0 投票
2 回答
5644 浏览

c# - 为什么必须在结构上调用 :this() 才能在 c# 中使用自动属性?

如果我使用这样的自动属性在 C# 中定义一个结构:

当我尝试构建文件时,我得到一个编译错误,说The 'this' object cannot be used before all of its fields are assigned to. 这可以通过更改构造函数以对默认构造函数进行链式调用来解决,如下所示:

我的问题是,为什么这会起作用,发生了什么?我有一个猜测,我试图通过查看 IL 来证明这一点,但如果我认为我可以分解 IL,那我只是在开玩笑。但我的猜测是,自动属性通过让编译器在幕后为您的属性生成字段来工作。这些字段无法通过代码访问,所有设置和获取都必须通过属性完成。创建结构时,不能显式定义默认构造函数。因此,在幕后,编译器必须生成一个默认构造函数,该构造函数设置开发人员看不到的字段的值。

欢迎任何和所有 IL 向导来证明或反驳我的理论。

0 投票
4 回答
2310 浏览

.net - 是否有将 CIL 编译为二进制文件的工具?

在看到之前的一篇文章“让使用 .NET 语言编写的应用程序在旧机器上运行”之后,我不得不怀疑;

是否有将 CIL 编译为二进制文件的工具?

如果是这样,如果您不希望用户需要 .NET 框架,您可以将 CIL 文件转换为本机 Windows 应用程序吗?甚至从 .NET 瞄准 linux 平台!那将是真棒!