20得票3回答
有没有一种方法可以查看JIT编译器为给定的C# / CIL代码生成的本机代码?

在这个回答中,有人建议使用位移操作符来代替整数乘除法以提高性能。我在评论中质疑这是否真的会更快。在我的脑海中,有一个想法,即在某个级别上,某些智能的编译器将会很聪明地认为>>1 和/2是相同的操作。但现在我怀疑这是否属实,如果是,它发生在哪个级别上。 一个测试程序生成了两个方法的...

24得票10回答
为什么静态类被认为是“类”和“引用类型”?

我今天思考了一下C#和CIL类型系统,开始怀疑为什么静态类被认为是类。它们有很多方面不是真正的类: “普通”类可以包含非静态成员,而静态类不能。在这方面,类更类似于结构体而不是静态类,但结构体有一个单独的名称。 您可以拥有对“普通”类的实例的引用,但不能拥有对静态类的引用(尽管它被视为“引...

11得票2回答
将lambda表达式作为IL流传递到辅助AppDomain中,并使用DynamicMethod将其重新组装

是否可以将 lambda 表达式作为 IL 字节流传递到辅助 AppDomain,并在那里使用 DynamicMethod 将其重新组装,以便可以调用它?我不确定这是第一步正确的方法,所以这是我提出这个问题的(详细)原因...在我的应用程序中,有许多情况需要加载几个程序集进行反射,以便我可以确...

20得票1回答
为什么类型System.__ComObject有时声称是公共的,但实际上并不是?

当我出于好奇在反思所有类型时,发现了一个奇怪的事情。 为什么程序集 mscorlib.dll 中的类 System.__ComObject(有时)声称是公共的,但实际上它似乎是非公开的?如果我在简单的 C# 控制台应用程序中运行以下代码: var t = Type.GetType("Sys...

12得票1回答
动态代码中的异常堆栈跟踪中出现了错误的文件路径和行号。

我们正在使用System.Reflection.Emit从源代码(即编译器)在运行时生成代码。我们使用MarkSequencePoint等方法为ILGenerator提供正确的符号信息,并在AssemblyBuilder上启用所有调试标志。该程序集在同一进程中保留在内存中并直接执行。 使用V...

9得票2回答
Array.Clear在底层实际上是做什么的?

我正在寻找一个答案,解释C#中Array.Clear(...)方法的内部工作原理。 我已经查看了IL代码,但这并没有给出任何线索,因为它只是在mscorlib中调用System.Array::Clear(...)方法,然后调用CLR的非托管部分,我无法观察到其内部工作。 我之所以问这个问题...

8得票1回答
CIL中普通指令和短格式指令有什么区别?

我正在研究CIL中的各种操作码,发现有很多看起来相似的代码,比如Beq、Beq_S、Bge、Bge_S、Bgt、Bgt_S、Br和Br_S。 其中S据说是“短格式”。这是什么意思?

10得票4回答
Mono.Cecil中type.IsAssignableFrom(derivedType)的等价方法

我正在使用Mono.Cecil来查找从给定类型派生的程序集中的类型。通常可以使用IsAssignableFrom()方法来完成,但我找不到Cecil中的等效方法。是否有这样的方法或其他检查方式? 谢谢 迈克

7得票2回答
一条C#语句能否生成非连接的MSIL?

这个问题涉及到C#语言规范、CIL语言规范以及Microsoft和Mono的C#编译器行为。 我正在构建一些代码分析工具(无论是什么),这些工具操作CIL。 考虑到一些代码示例,我注意到代码语句(try/catch、ifelse、ifthen、循环等)生成连接的MSIL块。 但我想确保我...

8得票2回答
C#编译器生成的.exe文件是否仅由公共中间语言(CIL)组成?

我只是想更好地了解以下情况:当将以下代码添加到文件并使用.cs扩展名保存时,简单场景会发生什么: public class HelloWorld { public static void Main() { System.Console.WriteLine("Hello Wor...