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

.net - 部分反汇编 .net 可执行文件

我需要编写一个相对较小的程序来解析 .net 可执行文件并生成对外部方法的调用列表。例如,如果System.Console.WriteLine在文件中调用该工具应该打印在System.Console.WriteLine某处调用的。我不能(有限的大脑和时间)也不需要(我只需要一个调用列表)实现真正的反汇编。我想要一个grep 友好的 perl 友好的相对较短的解决方案,它写入调用的函数的名称和调用发生的偏移量。

我已经尝试过的事情:

  1. 从 MSDN 下载规范。现在我知道静态调用被翻译成0x28字节码。:) 后面是方法描述符,但理解方法描述符的含义可能需要阅读整个规范。

  2. 在 Reflector 中打开简单的 exe。Reflector 精确地复制了我的原始应用程序的代码,但我看不到调用的字节码。

是否可以用有限的时间和知识实现所需的有限功能?

如果是这样,我知道如何实施它?是否有任何“CIL 傻瓜组装”指南?

0 投票
1 回答
758 浏览

cil - ECMA CIL/Microsoft MSIL 规范是否发生了重大变化?

.NET 通用中间语言的ECMA 标准已经更新了 3 次。我一直无法找到可以明确版本之间更改的版本历史记录。这四者之间是否有任何实质性差异,例如新的操作码等?

另外:MSIL 也一样吗?

谢谢!

0 投票
1 回答
469 浏览

c# - CIL 中的字符串生成器 (MSIL)

我正在尝试生成采用 StringBuilder 的代码,并将类中所有属性的值写入字符串。我有以下内容,但我目前在以下代码中得到“无效的方法令牌”:

有任何想法吗?提前致谢 :)

0 投票
1 回答
99 浏览

.net - .NET DynamicMethod 线程安全吗?

如果我用 ILGenerator 编写 DynamicMethod 并且我输出的代码是线程安全的,那么生成的委托是否是线程安全的?

我担心的是IL在方法第一次运行时被编译。如果这是真的,如果其他线程在编译时尝试运行委托会发生什么?

0 投票
1 回答
626 浏览

f# - F# 代码的发布版本中的 NOP

我在 VS2010 beta2 中使用 F#,由于我是 F# 新手,所以我只是选择了一个常见的例子,然后继续实现了一个阶乘函数:

如果我构建它并查看 Reflector 中生成的代码,我会得到相应的 C# 代码:

因此,如果我编译 F# 代码的 Reflector 的 C# 表示,我希望得到相同的 IL。

但是,如果我在发布模式下编译这两个片段并比较生成的 IL,它们是不同的(它们在功能上是相同的,但仍然有一点不同)。

C# 实现编译为:

F# 实现编译为:

生成的代码是相同的,除了不同的 maxstack 和 F# 方法中的附加 NOP 指令。

这可能并不重要,但我很好奇为什么 F# 编译器会在发布版本中插入 NOP。

谁能解释为什么?

(我完全清楚 F# 编译器没有经过与 C# 编译器相同级别的实际测试,但这很明显,我认为它会被捕获)。

编辑:编译命令如下

(为简洁起见,删除了引用的程序集)。

0 投票
2 回答
1555 浏览

.net - 将 .NET 表达式树链接到新程序集

我正在尝试编写自己的玩具 My Toy Language -> MSIL 编译器,以便更好地了解编译器的工作原理。我得到了解析和词法分析工作,我已经构建了表达式树并使用 System.Linq.Expressions 表达式树 API,我有一个工作解释器。现在我想发出一些真正的 MSIL 程序集。

问题是,我不知道如何实际构建这些程序集。MethodBuilder只接受原始 MSIL 方法体,因此我必须获取表达式树的原始 MSIL。调用Expression.Compile()返回一个工作委托,但我无法获得它的底层 MSIL。调用MethodInfo.GetMethodBody()会引发 InvalidOperationException,因为它未在该特定子类中实现。

如何将该委托链接到新程序集?

0 投票
2 回答
1796 浏览

c# - C# 编译为 MSIL 代码

Microsoft C# 编译器 (CSC.exe) 是否有输出中间语言文件的选项?有点像 GCC 中的 -S 开关?

0 投票
2 回答
885 浏览

c# - C# 编译器 + 带有装箱的通用代码 + 约束

让我们检查为以下通用方法生成的 MSIL 代码:

看:

但是对于上面的通用代码,更有效的 IL 表示应该是:

从约束中可知,该值被装箱到引用类型中。Unbox.anyopcode 是完全多余的,因为在boxopcode 之后,IL 堆栈中的值已经是对 的有效引用!!U,无需任何拆箱即可使用。

为什么 C# 3.0 编译器不使用约束元数据来生成更高效的通用代码?Unbox.any 的开销很小(只是慢了 4 到 5 倍),但为什么不在这种情况下发出更好的代码呢?

0 投票
4 回答
3448 浏览

.net - 对于一本关于 .NET CLR 和 CIL 的好书,您有什么建议?

您是否知道任何关于 CLR、 .NET FrameworkCIL的工作原理的好书,而不是任何特定的 .NET 语言?

0 投票
1 回答
6291 浏览

field - 为什么在调用 MSIL 中的字段之前必须执行 ldarg.0?

我想调用一个函数,作为参数 astring和 an Int32。thestring只是文字,Int32应该是field. 所以我认为它应该是这样的:

但这会引发错误,即这不是有效的代码。添加时

ldfld它运行正常之前。为什么会这样,当拥有更多字段时,这会给我带来麻烦吗?