问题标签 [il]

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 投票
1 回答
688 浏览

c# - IL 短格式指令不短?

我正在使用 Reflector 查看有效方法的 IL 代码,我遇到了这个问题:

带有后缀.s的指令应该采用 int8 操作数,果然这也应该是 Leave_S 的情况。但是0x0103是259,超出了一个int8的容量。该方法以某种方式起作用,但是当我使用Mono.Reflection.Disassembler.GetInstructions它检索的方法阅读说明时

也就是说,3 而不是 259,因为它应该是 int8。所以,我的问题是:原始指令 ( leave.s L_0103) 怎么可能?我已经查看了ECMA 文档(第III 部分:CIL 指令集),但找不到任何解释它的内容。

有任何想法吗?谢谢。


编辑#1:好的,我是个白痴。在分支指令的情况下,偏移量必须从当前指令之后的指令的开头开始计算。我发誓我阅读了文档,但不知何故我设法跳过了它。在我的辩护中,我今天病得很重。叹。

谢谢你。(感谢你没有叫我白痴,尽管这很白痴:P)


编辑#2:顺便说一句,如果有人感兴趣,当Mono.Reflection.Disassembler.GetInstructions反汇编指令时,它会改变分支指令中操作数的含义。特别是,正如已经指出的那样,分支指令的操作数表示从下一条指令开始的偏移量,而不是从 0 开始的偏移量。但是,Mono.Reflection返回从 0 开始的偏移量(这可能是我感到困惑的原因;虽然它没有解释我是如何设法跳过部分文档的)。

的提取物MethodBodyReader.ReadOperand(Instruction instruction)

如您所见,它添加了il.position,这是下一条指令的偏移量(从 0 开始)。此外,它转换为sbyte,这就是我得到 3 而不是 259 的原因。这似乎是一个错误(从 0 开始的偏移量可能大于 a sbyte)。我会问 Jb Evain(作者)并报告。


编辑#3:他还没有回答,但我已将其更改为:

它似乎解决了我的问题。如果它是向后跳跃(负偏移),我会转换sbyte为正确的符号,然后当我添加il.position(这是一个int)时,结果是一个int

无论如何,我会让你知道他说什么。


编辑#4:我忘了报告。作者确认这是一个错误。

0 投票
7 回答
5421 浏览

.net - 确定 .NET 程序集是否是从同一源构建的

有谁知道比较两个 .NET 程序集以确定它们是否是从“相同”源文件构建的方法?

我知道有一些可用的差异实用程序,例如 Reflector 的插件,但我对查看 GUI 中的差异不感兴趣,我只想要一种自动化的方式来比较二进制文件的集合,看看它们是否是从相同(或等效)的源文件。我知道多个不同的源文件可以生成相同的 IL,并且意识到该过程只会对 IL 中的差异敏感,而不是原始源。

仅比较两个程序集的字节流的主要障碍是 .NET 在程序集中包含一个名为“MVID”(模块版本标识符)的字段。这似乎对每次编译都有不同的值,所以如果你构建相同的代码两次,程序集会有所不同。

一个相关的问题是,有谁知道如何强制每个编译的 MVID 相同?这将避免我们需要一个对 MVID 值差异不敏感的比较过程。一致的 MVID 更可取,因为这意味着可以使用标准校验和。

这背后的背景是,在我们被允许发布到生产环境之前,第三方公司负责独立审查和签署我们的发布。这包括审查源代码。他们希望独立确认我们提供给他们的源代码与我们之前构建、测试和当前计划部署的二进制文件相匹配。我们正在寻找一种流程,使他们能够从我们提供给他们的源代码独立构建系统,并将校验和与我们测试过的二进制文件的校验和进行比较。

顺便提一句。请注意,我们正在使用持续集成、自动构建、源代码控制等。该问题与内部缺乏对特定构建中的源文件的控制无关。问题是第三方负责验证我们提供给他们的源是否产生了我们已经测试并计划投入生产的相同二进制文件。他们不应该信任我们的任何内部系统或控制,包括构建服务器或源代码控制系统。他们所关心的只是获取与构建相关联的源,自己执行构建,并验证输出是否与我们所说的部署相匹配。

比较解决方案的运行速度并不是特别重要。

谢谢

0 投票
1 回答
180 浏览

cil - 短路评估如何在 MSIL 中工作

短路评估如何在 msil 解释器中工作?And 指令是否包含有关如果为 false 时跳转到何处的信息,并且对于 OR 和 true 是否相同?

0 投票
1 回答
804 浏览

c# - 遍历ac#方法并解析方法体

在 c# 中遍历方法信息的最简单方法是什么?

我想遍历方法体并找到字段引用等并检索类型。

在 System.Reflection 中有:

这有点低级,在我能够遍历身体之前需要“一些”工作。

我知道 Cecil 存在,但是用 cecil 加载内存程序集时存在问题。我正在使用的程序集并不总是“在磁盘上”,它可以是从例如编译的内存程序集。嘘,如果不将程序集临时写入磁盘,我就没有一个干净的解决方案。

有什么其他的选择呢?

0 投票
2 回答
768 浏览

.net - CLR 4.0 中引入了哪些操作码?

与 3.5 相比,.NET 4.0 中是否有任何新的 IL 操作码,如果有,我在哪里可以找到它们的列表?

0 投票
3 回答
502 浏览

.net - 从程序集中提取特定 IL(.NET 中间语言)签名的机制

我在 Microsoft .NET 程序集 mscorlib.dll 中找到了大约 25 种类型的列表,我需要在其中提取类及其成员的 IL 签名。我想要每种类型一个文件,每个签名在一行上。因此,例如,采用类型

我想从该类型的程序集中提取以下内容(有一些我不需要的私有成员,但如果需要我可以手动处理)。

所以,我想了四种方法来实现这一点:

  • 手动将每种类型的每个签名手动剪切并粘贴到 ildasm 的文本文件中(直接或通过 mscorlib.dll 的转储)。有些类型很长,所以这可能会变得乏味。如果我需要做更多,这绝对不是一个好的长期解决方案。

  • 编写一个使用反射的工具来尝试获取所有签名。我在高层次上考虑过使用下面的伪代码 [1] 之类的东西。

  • 编写一个工具,在 ildasm 的 IL 转储上使用字符串解析来查找类型并获取签名

  • 使用现有的工具来完成任务。

有谁知道可以帮助我完成任务的现有工具或机制?如果没有,关于制作这样一个工具的方向有什么建议吗?如果您对如何完成它有任何代码想法,我将不胜感激。

[1]

0 投票
1 回答
205 浏览

mono - 单声道运行时是否已经按照 IL 规范的要求处理尾调用优化?

我知道这个臭名昭著的帖子

http://flyingfrogblog.blogspot.com/2009/01/mono-does-not-support-tail-calls.html

mono 运行时没有按照 IL 的要求提供尾调用消除。从那以后情况发生了变化吗?

0 投票
3 回答
1069 浏览

c# - EmitCall 在 Silverlight 中引发“操作可能会破坏运行时的稳定性”

我是 IL 语言的 n00b。在我的任务中,我必须创建从System.ServiceModel.DomainServices.Client.Entity. 当我添加其他代码来设置属性方法时,我收到“操作可能会破坏运行时”。请帮帮我,解决这个问题。

来自反射器的代码:

我的代码:

0 投票
0 回答
207 浏览

vb.net - 通过使用代码生成动态添加处理程序来捕获事件

我需要连接应用程序中的所有事件并跟踪所有信息(引发、争论等)。

我在 Stackoverflow 找到了这个: Tracing all events in VB.NET

但是,我需要一个解决方案,不仅将调用的事件写入控制台,而且调用 TraceVerbose 并使用显示发送者和事件参数的参数。

我仍在努力了解动态代码生成和 IL,因此我不知道如何让代码使用事件中的参数调用跟踪方法。

谁能告诉我怎么做(在 VB.NET 中)?

0 投票
2 回答
2994 浏览

visual-studio - 是否有任何从 Visual Studio 项目中编译 CIL 代码的示例

我意识到有人询问并回答了 Visual Studio 不支持 CIL/MSIL 项目。MSBuildContrib项目有一个ILASM任务,允许您在构建时编译 IL 文件。

谷歌上没有关于如何使用此任务的示例。

有没有使用 ILASM 作为 Visual Studio 解决方案一部分的示例?我意识到#develope 和 ILIDE 支持 CIL...这里的目标是编译一些 CIL 文件作为 Visual Studio 解决方案的一部分