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

c# - 在 MSIL 中可以做什么而在 C# 或 VB.NET 中无法做到?

用 .NET 语言编写的所有代码都编译为 MSIL,但是否有特定任务/操作只能直接使用 MSIL 执行?

让我们在 MSIL 中做的事情也比 C#、VB.NET、F#、j# 或任何其他 .NET 语言更容易。

到目前为止,我们有这个:

  1. 尾递归
  2. 通用协/逆变(在 C# 4 和 VB 10 中允许)
  3. 仅返回类型不同的重载
  4. 覆盖访问修饰符
  5. 有一个不能从 System.Object 继承的类
  6. 过滤的异常(在 VB 和 C# 6 中允许)
  7. 调用当前静态类类型的虚方法。
  8. 获取值类型的盒装版本的句柄。
  9. 做一个尝试/错误。
  10. 使用禁止名称。
  11. 为值类型定义自己的无参数构造函数
  12. raise使用元素定义事件。
  13. CLR 允许但 C# 不允许的某些转换。
  14. 将非main()方法设为.entrypoint.
  15. 直接使用本机int和本机unsigned int类型。
  16. 使用瞬态指针
  17. MethodBodyItem 中的 emitbyte 指令
  18. 抛出和捕获非 System.Exception 类型
  19. 继承枚举(未验证)
  20. 您可以将字节数组视为(小 4 倍)整数数组。
  21. 您可以让一个字段/方法/属性/事件都具有相同的名称(未验证)。
  22. 您可以从它自己的 catch 块分支回到 try 块。
  23. 您可以访问 famandassem 访问说明符(protected internal是 famassem,但现在在 C# 7.2 和 VB 15.5 中允许)
  24. 直接访问<Module>用于定义全局函数的类或模块初始化程序。
  25. 创建和使用基于 1 的非零边界数组
  26. 创建开放实例和封闭静态委托,以及 getter/setter 的委托
  27. 在不使用临时变量的情况下交换两个值
  28. 显式实现任意名称的接口,实现两个接口功能合二为一(VB可以实现)
  29. 声明vtfixup(相当于externC 语言)
  30. 指定任意modoptmodreq
0 投票
3 回答
2479 浏览

c# - 这个编译器生成的枚举器是什么意思?

我写了一个相当复杂的方法 yield-returns IEnumerable<string>,但是当我在 Reflector 中检查编译器输出时,我不明白编译器生成的实现的特定部分IEnumerator

我猜测(或希望)Reflector 放错了外部的右大括号switch,并且它应该直接在return. 不过,我不明白为什么在案例 3 中有一个空开关,或者为什么在一个块m__Finallya中被调用。finally(正常运行和在块内运行之间是否存在语义差异finally?除了 CER,我的代码中没有。)

作为参考,这里是 IL:

0 投票
6 回答
40344 浏览

c# - .net 反汇编器/反编译器

我正在寻找反汇编器或更好的.net 反编译器。情况是我的一位前辈编写的程序集的源代码丢失了,我想看看它在做什么。

我知道 ildasm 附带 Visual Studio 安装,因此我可以获取 MSIL,但我希望有一个足够聪明的程序可以返回 C# 代码(或最佳近似值)。

有什么工具可以解决这个问题吗?

(如果没有,我想这将是我坐下来开始学习 MSIL 的好借口)

0 投票
4 回答
20663 浏览

.net - beforefieldinit 标志有什么作用?

beforefieldinit 标志有什么作用?当我查看班级的 IL 时,我看到了这个标志,但我不知道这个标志实际上在做什么?

0 投票
4 回答
828 浏览

.net - 在 .NET 中,当您将类实例/接口作为参数传递时,您是传递一个对象还是完整的 vtable

如果您将接口或类的实例作为参数传递,我们是在传递许多对象还是完整的 vtable,因为一旦您在实例上调用方法,它就需要递归 vtable 并调用适当的方法?
这是如何运作的?

0 投票
3 回答
1818 浏览

c# - CIL:“操作可能会破坏运行时”异常

我一直在玩 PostSharp,但遇到了一个令人讨厌的问题。

在 Silverlight 程序集中遵循 IL:

触发 System.Security.VerificationException:操作可能会破坏运行时。例外。反射器解析它OK。它有什么问题?

更新 1 代码的工作原理如下:

更新 2 我在 setter 本身中得到了指定的异常

更新 3 作为 callvirt (NotifyPropertyChanged) 进行非静态调用没有帮助

更新 4 注释掉(出于测试目的)代码:

并将 L_001e: brtrue.s L_002b 替换为 L_001e: br.s L_002b 可以解决问题,但它是无条件返回 - 不是我想要的。

更新 5 如果我使用 C# 编译器来模拟所需的行为(我仍然需要使用 Postsharp 来做到这一点),我会得到以下 IL:

请注意有细微的差别 - 额外的 br.s 在 L_0016 处跳转和一些奇怪的跳转 L_001e: brtrue.s L_002b。在编译器版本中,我可以直接跳转到 ret。

0 投票
4 回答
982 浏览

c# - 关闭 JIT,并控制 MSIL(自己的 VM)中的代码流

我正在用 C# 编写自己的脚本语言,具有一些我喜欢的特性,并且我选择使用 MSIL 作为输出的字节码(Reflection.Emit 非常有用,我不必想出另一个字节码)。它可以工作,发出可执行文件,可以运行(甚至可以使用 Reflector 反编译 :))并且速度非常快。

但是 - 我想在一个进程+一个线程中运行多个“进程”,并手动控制它们分配的 CPU 时间(也实现由 .NET 框架提供的更强大的 IPC)有没有办法完全禁用 JIT 并创建自己的VM,使用.NET框架(并控制内存使用等)在指令后步进指令,无需自己编写任何东西,或者要实现这一点,我必须编写整个MSIL解释?

编辑 1): 我知道解释 IL 并不是世界上最快的事情:)

编辑2):澄清-我希望我的VM成为某种“操作系统”-它获得一些CPU时间并将其分配给进程,控制它们的内存分配等等。它不必很快,也不必有效,而只是我的一些实验的概念证明。我不需要在处理每条指令的级别上实现它 - 如果这应该由 .NET 完成,我不会介意,我只想说:第一步指令,等到我告诉你下一步。

编辑 3):我意识到,ICorDebug 可能可以满足我的需求,现在正在查看 Mono 运行时的实现。

0 投票
6 回答
2277 浏览

ide - MSIL 的 IDE

SO上有很多关于MSIL的问题,但没有一个可以直接回答这个问题。

我一直在使用Textpad,它确实有 MSIL 的语法定义文件,然后在命令提示符窗口中使用 ILASM。

我确实找到了对 ILIDE 的引用,但链接已损坏。

是否有适用于 MSIL 的 Visual Studio/Eclipse 的 IDE 或附加组件/插件,允许语法高亮、智能感知、代码完成、调试等?

0 投票
1 回答
3594 浏览

debugging - MSIL 调试器 - Mdbg、Dbgclr、Cordbg

我一直在做一些 MSIL 工作,并且遇到了对这三个调试器的引用。

  • 他们之间有什么区别?

  • 其中一个比其他的更好吗?功能?

  • 还有其他我错过的吗?

0 投票
3 回答
18300 浏览

cil - MSIL 方法中 hidebysig 的目的是什么?

使用 ildasm 和 C# 程序,例如

给出:

hidebysig 结构有什么作用?