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

c# - 方法名称会编译到 EXE 中吗?

将 Windows 应用程序项目编译为 EXE 后,类、方法和变量名称是否包含在 MSIL 中?

  • 对于混淆- 更少的名称,更难逆向工程。
  • 并且为了性能- 更短的名称,更快的访问。

例如,如果方法是通过名称调用的:

  • 保持名称简短,命名查找的性能更好。
  • 保持名称神秘,更难反编译。
0 投票
3 回答
2337 浏览

cil - 从字节数组中获取 IL 的 API

MethodBody 类中有一个 GetILAsByteArray 方法,它给出了方法的主体。我正在寻找将此字节数组转换为更易于理解的 IL 指令(转换为 List 或类似的东西)。有哪些资源、开源代码或 api 可以帮助我理解和转换这个字节数组(或为我做)?

我发现了这一点,但它不适用于泛型。我非常期待在所有框架版本中转换理解这些字节的指导。

CLI 文档对于学习 IL 指令也很有帮助,但我看不出如何使用它来使这些字节有意义。

0 投票
7 回答
14959 浏览

c# - 在 C# 中使用枚举索引数组

我有很多固定大小的数字集合,其中每个条目都可以使用常量访问。自然,这似乎指向数组和枚举:

这样做的问题当然是您不能使用枚举来索引没有强制转换的数组(尽管编译的 IL 使用纯整数)。所以你必须到处写这个:

我试图找到在不强制转换的情况下使用相同简单语法的方法,但还没有找到完美的解决方案。使用字典似乎是不可能的,因为我发现它比数组慢大约 320 倍。我还尝试为以枚举为索引的数组编写一个泛型类:

甚至是带有指定枚举的第二个通用参数的变体。这与我想要的非常接近,但问题是您不能只将非特定枚举(无论是来自泛型参数还是盒装类型枚举)强制转换为 int。相反,您必须先将其与对象的转换相结合,然后再将其转换回。这有效,但速度很慢。我发现为索引器生成的 IL 看起来像这样:

如您所见,那里有不必要的装箱和拆箱说明。如果将它们从二进制文件中剥离出来,代码就可以正常工作,并且比纯数组访问慢一点。

有什么方法可以轻松克服这个问题吗?或者甚至更好的方法?我认为也可以使用自定义属性标记此类索引器方法并在编译后剥离这两个指令。什么是合适的图书馆?也许是 Mono.Cecil?

当然,总是有可能删除枚举并使用如下常量:

这可能是最快的方法,因为您可以直接访问数组。

0 投票
5 回答
44275 浏览

java - Java的虚拟机和CLR

作为对名为“MSIL 和 Java 字节码之间的差异”的问题的一种跟进?,Java虚拟机的工作方式与Java虚拟机的工作方式有什么(主要)差异或相似之处.NET 框架公共语言运行时 (CLR) 有效吗?

另外,是.NET 框架CLR 是“虚拟机”还是不具备虚拟机的属性?

0 投票
3 回答
319 浏览

c# - 是否有工具可以在 Visual Studio 中选择一些代码并让它显示相应的 MSIL?

最近我发现自己经常运行 ILDASM 来研究我的程序的 MSIL 输出。

是否有任何实用程序可以简化此操作?理想情况下,最好选择一些源代码并让它在 MSIL 中编译、反汇编和发出选定的 C# 代码。

有人知道这样的事情吗?

0 投票
2 回答
874 浏览

properties - 如何访问 CIL (MSIL) 中的对象属性?

我是一个绝对的初学者,你看。假设我在堆栈上有一个字符串对象,并且想要获取其中的字符数 - 它的 .Length 属性。我将如何获得隐藏在里面的 int32 数字?

提前谢谢了!

0 投票
2 回答
547 浏览

reverse-engineering - 我在哪里可以获得所有 MSIL 代码及其十六进制值的列表?

有人有所有 MSIL 代码及其相应十六进制值的列表或图表吗?

0 投票
7 回答
3131 浏览

.net - 程序化 MSIL 注入

假设我有一个这样的错误应用程序:

该应用程序已经编译并部署到野外。有人发现了这个错误,现在他们正在请求修复它。虽然我可以使用修复程序重新部署此应用程序,但由于我无法控制的原因,这非常麻烦——我只想为该错误编写一个补丁程序。

具体来说,我想将我自己的 MSIL 插入到有问题的汇编源文件中。我以前从来没有做过这样的事情,谷歌搜索也没有找到任何有用的信息。如果我可以在上面的代码中看到如何执行此操作的示例,它将极大地帮助我:)

如何以编程方式将自己的 MSIL 注入已编译的 .NET 程序集?

[编辑添加:] 对于那些问的人:我不需要运行时热交换。关闭应用程序,操作程序集,然后再次重新启动程序对我来说非常好。

[再编辑一次:] 看起来普遍的共识是“操纵程序集是修补程序的方法”。如果这是一个坏主意,我不会走那条路。

我会留下这个问题,因为 MSIL 注入可能仍然对其他目的有用:)

0 投票
3 回答
700 浏览

c# - 如何扫描 MSIL 代码以查找某些函数调用

我要构建一个 SOA gui 框架,我想从客户端模块自动检测服务和服务依赖项。到目前为止,我有这样的代码,它使用属性工作,放置在类模块上:

我想知道如何自动扫描这些,这样人们就不会忘记添加标记并可能在运行时获得空引用。在代码中,服务通过以下命令注册和获取:

我想找到这些调用,以及传入的类型(都采用类型参数,第一个是隐式的)......用于执行我的依赖项和构造的其余代码已经完成:)

0 投票
5 回答
2561 浏览

c# - .NET 中 CIL 知识的优势

了解 CIL 有什么好处?

您必须了解汇编才能理解它吗?这些文件中的代码看起来很相似。

我如何进一步了解它?任何关于它的书,比如 Jon Skeet 的 C# 书?