问题标签 [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.
.net - 部分反汇编 .net 可执行文件
我需要编写一个相对较小的程序来解析 .net 可执行文件并生成对外部方法的调用列表。例如,如果System.Console.WriteLine
在文件中调用该工具应该打印在System.Console.WriteLine
某处调用的。我不能(有限的大脑和时间)也不需要(我只需要一个调用列表)实现真正的反汇编。我想要一个grep 友好的 perl 友好的相对较短的解决方案,它写入调用的函数的名称和调用发生的偏移量。
我已经尝试过的事情:
从 MSDN 下载规范。现在我知道静态调用被翻译成
0x28
字节码。:) 后面是方法描述符,但理解方法描述符的含义可能需要阅读整个规范。在 Reflector 中打开简单的 exe。Reflector 精确地复制了我的原始应用程序的代码,但我看不到调用的字节码。
是否可以用有限的时间和知识实现所需的有限功能?
如果是这样,我知道如何实施它?是否有任何“CIL 傻瓜组装”指南?
c# - CIL 中的字符串生成器 (MSIL)
我正在尝试生成采用 StringBuilder 的代码,并将类中所有属性的值写入字符串。我有以下内容,但我目前在以下代码中得到“无效的方法令牌”:
有任何想法吗?提前致谢 :)
.net - .NET DynamicMethod 线程安全吗?
如果我用 ILGenerator 编写 DynamicMethod 并且我输出的代码是线程安全的,那么生成的委托是否是线程安全的?
我担心的是IL在方法第一次运行时被编译。如果这是真的,如果其他线程在编译时尝试运行委托会发生什么?
f# - F# 代码的发布版本中的 NOP
我在 VS2010 beta2 中使用 F#,由于我是 F# 新手,所以我只是选择了一个常见的例子,然后继续实现了一个阶乘函数:
如果我构建它并查看 Reflector 中生成的代码,我会得到相应的 C# 代码:
因此,如果我编译 F# 代码的 Reflector 的 C# 表示,我希望得到相同的 IL。
但是,如果我在发布模式下编译这两个片段并比较生成的 IL,它们是不同的(它们在功能上是相同的,但仍然有一点不同)。
C# 实现编译为:
F# 实现编译为:
生成的代码是相同的,除了不同的 maxstack 和 F# 方法中的附加 NOP 指令。
这可能并不重要,但我很好奇为什么 F# 编译器会在发布版本中插入 NOP。
谁能解释为什么?
(我完全清楚 F# 编译器没有经过与 C# 编译器相同级别的实际测试,但这很明显,我认为它会被捕获)。
编辑:编译命令如下
(为简洁起见,删除了引用的程序集)。
.net - 将 .NET 表达式树链接到新程序集
我正在尝试编写自己的玩具 My Toy Language -> MSIL 编译器,以便更好地了解编译器的工作原理。我得到了解析和词法分析工作,我已经构建了表达式树并使用 System.Linq.Expressions 表达式树 API,我有一个工作解释器。现在我想发出一些真正的 MSIL 程序集。
问题是,我不知道如何实际构建这些程序集。MethodBuilder类只接受原始 MSIL 方法体,因此我必须获取表达式树的原始 MSIL。调用Expression.Compile()返回一个工作委托,但我无法获得它的底层 MSIL。调用MethodInfo.GetMethodBody()会引发 InvalidOperationException,因为它未在该特定子类中实现。
如何将该委托链接到新程序集?
c# - C# 编译为 MSIL 代码
Microsoft C# 编译器 (CSC.exe) 是否有输出中间语言文件的选项?有点像 GCC 中的 -S 开关?
c# - C# 编译器 + 带有装箱的通用代码 + 约束
让我们检查为以下通用方法生成的 MSIL 代码:
看:
但是对于上面的通用代码,更有效的 IL 表示应该是:
从约束中可知,该值被装箱到引用类型中。Unbox.any
opcode 是完全多余的,因为在box
opcode 之后,IL 堆栈中的值已经是对 的有效引用!!U
,无需任何拆箱即可使用。
为什么 C# 3.0 编译器不使用约束元数据来生成更高效的通用代码?Unbox.any 的开销很小(只是慢了 4 到 5 倍),但为什么不在这种情况下发出更好的代码呢?
.net - 对于一本关于 .NET CLR 和 CIL 的好书,您有什么建议?
您是否知道任何关于 CLR、 .NET Framework和CIL的工作原理的好书,而不是任何特定的 .NET 语言?
field - 为什么在调用 MSIL 中的字段之前必须执行 ldarg.0?
我想调用一个函数,作为参数 astring
和 an Int32
。thestring
只是文字,Int32
应该是field
. 所以我认为它应该是这样的:
但这会引发错误,即这不是有效的代码。添加时
在ldfld
它运行正常之前。为什么会这样,当拥有更多字段时,这会给我带来麻烦吗?