问题标签 [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# - 在 MSIL 中可以做什么而在 C# 或 VB.NET 中无法做到?
用 .NET 语言编写的所有代码都编译为 MSIL,但是否有特定任务/操作只能直接使用 MSIL 执行?
让我们在 MSIL 中做的事情也比 C#、VB.NET、F#、j# 或任何其他 .NET 语言更容易。
到目前为止,我们有这个:
- 尾递归
- 通用协/逆变(在 C# 4 和 VB 10 中允许)
- 仅返回类型不同的重载
- 覆盖访问修饰符
- 有一个不能从 System.Object 继承的类
- 过滤的异常(在 VB 和 C# 6 中允许)
- 调用当前静态类类型的虚方法。
- 获取值类型的盒装版本的句柄。
- 做一个尝试/错误。
- 使用禁止名称。
- 为值类型定义自己的无参数构造函数。
raise
使用元素定义事件。- CLR 允许但 C# 不允许的某些转换。
- 将非
main()
方法设为.entrypoint
. - 直接使用本机
int
和本机unsigned int
类型。 - 使用瞬态指针
- MethodBodyItem 中的 emitbyte 指令
- 抛出和捕获非 System.Exception 类型
- 继承枚举(未验证)
- 您可以将字节数组视为(小 4 倍)整数数组。
- 您可以让一个字段/方法/属性/事件都具有相同的名称(未验证)。
- 您可以从它自己的 catch 块分支回到 try 块。
- 您可以访问 famandassem 访问说明符(
protected internal
是 fam或assem,但现在在 C# 7.2 和 VB 15.5 中允许) - 直接访问
<Module>
用于定义全局函数的类或模块初始化程序。 - 创建和使用基于 1 的非零边界数组
- 创建开放实例和封闭静态委托,以及 getter/setter 的委托
- 在不使用临时变量的情况下交换两个值
- 显式实现任意名称的接口,实现两个接口功能合二为一(VB可以实现)
- 声明
vtfixup
(相当于extern
C 语言) - 指定任意
modopt
或modreq
c# - 这个编译器生成的枚举器是什么意思?
我写了一个相当复杂的方法 yield-returns IEnumerable<string>
,但是当我在 Reflector 中检查编译器输出时,我不明白编译器生成的实现的特定部分IEnumerator
:
我猜测(或希望)Reflector 放错了外部的右大括号switch
,并且它应该直接在return
. 不过,我不明白为什么在案例 3 中有一个空开关,或者为什么在一个块m__Finallya
中被调用。finally
(正常运行和在块内运行之间是否存在语义差异finally
?除了 CER,我的代码中没有。)
作为参考,这里是 IL:
c# - .net 反汇编器/反编译器
我正在寻找反汇编器或更好的.net 反编译器。情况是我的一位前辈编写的程序集的源代码丢失了,我想看看它在做什么。
我知道 ildasm 附带 Visual Studio 安装,因此我可以获取 MSIL,但我希望有一个足够聪明的程序可以返回 C# 代码(或最佳近似值)。
有什么工具可以解决这个问题吗?
(如果没有,我想这将是我坐下来开始学习 MSIL 的好借口)
.net - beforefieldinit 标志有什么作用?
beforefieldinit 标志有什么作用?当我查看班级的 IL 时,我看到了这个标志,但我不知道这个标志实际上在做什么?
.net - 在 .NET 中,当您将类实例/接口作为参数传递时,您是传递一个对象还是完整的 vtable
如果您将接口或类的实例作为参数传递,我们是在传递许多对象还是完整的 vtable,因为一旦您在实例上调用方法,它就需要递归 vtable 并调用适当的方法?
这是如何运作的?
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。
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 运行时的实现。
ide - MSIL 的 IDE
SO上有很多关于MSIL的问题,但没有一个可以直接回答这个问题。
我一直在使用Textpad,它确实有 MSIL 的语法定义文件,然后在命令提示符窗口中使用 ILASM。
我确实找到了对 ILIDE 的引用,但链接已损坏。
是否有适用于 MSIL 的 Visual Studio/Eclipse 的 IDE 或附加组件/插件,允许语法高亮、智能感知、代码完成、调试等?
debugging - MSIL 调试器 - Mdbg、Dbgclr、Cordbg
我一直在做一些 MSIL 工作,并且遇到了对这三个调试器的引用。
他们之间有什么区别?
其中一个比其他的更好吗?功能?
还有其他我错过的吗?
cil - MSIL 方法中 hidebysig 的目的是什么?
使用 ildasm 和 C# 程序,例如
给出:
hidebysig 结构有什么作用?