问题标签 [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.
c# - 有没有办法计算执行的 IL 指令的数量?
我想对 C# 进程进行一些基准测试,但我不想将时间用作我的向量——我想计算在特定方法调用中执行的 IL 指令的数量。这可能吗?
编辑我不是指对方法体的静态分析——我指的是执行的实际指令数——因此,例如,如果方法体包括一个循环,则计数将增加多少指令up the loop * 循环迭代的次数。
cil - CIL 堆栈交换指令
是否有 CIL 指令来交换堆栈中的前两个元素?
.net - 呼叫和 Callvirt
CIL 指令“Call”和“Callvirt”有什么区别?
c# - ILGenerator 有一个好的包装器吗?
我现在使用 System.Reflection.Emit 有一段时间了,发现它(谁没有?)和容易出错一样痛苦。
你知道 IL 生成器周围是否有一个很好的包装器,我可以依靠它以比直接使用 SRE 更安全、更容易的方式发出 IL?
编辑:
我知道操作表达式树肯定比直接发出 IL 更容易、更安全,但它们现在也有一些限制。我不能创建代码块、使用循环、声明和使用几个本地人等等。我们需要等到 .NET 4 出来:)
此外,我正在处理一个已经依赖于 SRE 的代码库。
显然,ILGenerator 做了我需要的一切。但是在操作它时,我会很感激更多的帮助。当我提到 ILGenerator 包装器时,它仍然处于相当低的级别,我想到了一些可以提供以下方法的方法:
这确实是 3 个幼稚的例子,但足以证明我的期望。我们可以将其视为一组扩展方法,但最好支持条件语句和循环,如RunSharp。事实上,RunSharp 与我想要的非常接近,但它过多地抽象了 ILGenerator 并且没有公开其所有功能。
我不记得在哪里了,但是我已经在一个开源项目中看到过这样的助手。
c# - 如果在 .NET 中将事件实现为委托,那么 .event IL 部分的意义何在?
我在 Stack Overflow 上看到了一些关于委托、事件和这两个功能的 .NET 实现的非常好的问题。特别是一个问题,“ C# 事件如何在幕后工作? ”,产生了一个很好的答案,很好地解释了一些微妙的观点。
上述问题的答案说明了这一点:
当您声明类似字段的事件时......编译器会生成方法和私有字段(与委托的类型相同)。在类中,当您引用 ElementAddedEvent 时,您指的是该字段。在课堂之外,您指的是该领域
从同一问题(“ Field-like events ”)链接的 MSDN 文章补充说:
引发事件的概念完全等同于调用由事件表示的委托——因此,引发事件没有特殊的语言结构。
为了进一步检查,我构建了一个测试项目,以查看事件和委托编译到的 IL:
我希望委托字段handler
和事件FooEvent
编译成大致相同的 IL 代码,并使用一些额外的方法来包装对编译器生成的FooEvent
字段的访问。但生成的 IL 并不完全符合我的预期:
由于事件只不过是编译器生成的委托add
和remove
方法,我没想到会在 IL 中看到事件被视为更多。但是 add 和 remove 方法是在开头的部分中定义的.event
,而不是.method
像普通方法那样。
我的终极问题是:如果事件被简单地实现为具有访问器方法的委托,那么拥有.event
IL 部分的意义何在?如果没有这个,它们不能通过使用.method
部分在 IL 中实现吗?.event
相当于.method
? _
assembly - CIL nop 操作码的目的是什么?
我正在浏览 MSIL 并注意到 MSIL 中有很多nop指令。
MSDN 文章说,如果操作码被修补,它们不会执行任何操作并用于填充空间。它们在调试版本中的使用比在发布版本中更多。
我知道这些语句在汇编语言中用于对齐后面的指令,但是为什么 MSIL 中需要 MSIL nop 呢?
(编者注:接受的答案是关于机器代码 NOP,而不是问题最初询问的 MSIL/CIL NOP。)
asp.net - 自动 MSIL 到 JavaScript 的转换有用吗?
我一直在从事一个名为Axial的项目,该项目将 MSIL(已编译的 C# 或 VB.NET)转换为 JavaScript。有一些工作代码示例,但一些常见情况无法正常工作。(当前版本不能在生产模式下工作,SVN 代码不能在调试模式下工作,但更干净。)我从很多人那里听说他们讨厌编写 JavaScript,所以我知道这个项目有一些优点,但我猜这种态度在 SO 社区中并不那么普遍。
假设产品完美流畅地运行,那么您的 JavaScript 100% 的时间都可以正常工作,并且 Visual Studio 插件可确保您正确使用产品。这是您或您的组织会使用的东西吗?除了直接代码翻译之外,您还会对哪些功能感兴趣?
c# - 调用基类的事件处理程序的 MSIL 是什么?
我有一个名为 EventConsumer 的类,它定义了一个事件 EventConsumed 和一个方法 OnEventConsumed,如下所示:
我需要在 OnEventConsumed 运行时添加属性,所以我使用 System.Reflection.Emit 生成一个子类。我想要的是与此等效的 MSIL:
我到目前为止是这样的:
我创建类型,创建类型的实例,并调用它的 OnEventConsumed 函数,然后我得到:
...这并不完全有帮助。我究竟做错了什么?调用基类的事件处理程序的正确 MSIL 是什么?
c# - 为什么必须在结构上调用 :this() 才能在 c# 中使用自动属性?
如果我使用这样的自动属性在 C# 中定义一个结构:
当我尝试构建文件时,我得到一个编译错误,说The 'this' object cannot be used before all of its fields are assigned to
. 这可以通过更改构造函数以对默认构造函数进行链式调用来解决,如下所示:
我的问题是,为什么这会起作用,发生了什么?我有一个猜测,我试图通过查看 IL 来证明这一点,但如果我认为我可以分解 IL,那我只是在开玩笑。但我的猜测是,自动属性通过让编译器在幕后为您的属性生成字段来工作。这些字段无法通过代码访问,所有设置和获取都必须通过属性完成。创建结构时,不能显式定义默认构造函数。因此,在幕后,编译器必须生成一个默认构造函数,该构造函数设置开发人员看不到的字段的值。
欢迎任何和所有 IL 向导来证明或反驳我的理论。
.net - 是否有将 CIL 编译为二进制文件的工具?
在看到之前的一篇文章“让使用 .NET 语言编写的应用程序在旧机器上运行”之后,我不得不怀疑;
是否有将 CIL 编译为二进制文件的工具?
如果是这样,如果您不希望用户需要 .NET 框架,您可以将 CIL 文件转换为本机 Windows 应用程序吗?甚至从 .NET 瞄准 linux 平台!那将是真棒!