Questions tagged «cil»

通用中间语言是.NET Framework,.NET Core和Mono使用的面向对象的汇编语言。.NET语言可编译为CIL,然后将CIL组装为具有字节码样式格式的目标代码。

7
堆栈的目的是什么?我们为什么需要它?
因此,我现在正在学习MSIL,以学习调试C#.NET应用程序。 我一直想知道:堆栈的目的是什么? 只是为了回答我的问题: 为什么要从内存转移到堆栈或“加载”?另一方面,为什么要从堆栈转移到内存或“存储”呢? 为什么不将它们全部放置在内存中? 是因为速度更快吗? 是因为它基于RAM吗? 为了效率? 我试图抓住这一点,以帮助我更深入地了解CIL代码。
320 c#  .net  vb.net  cil  .net-assembly 

20
在MSIL中可以做什么,而在C#或VB.NET中不能做什么?[关闭]
从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 用.NET语言编写的所有代码都可以编译为MSIL,但是是否存在只能直接使用MSIL才能执行的特定任务/操作? 让我们在MSIL中也比C#,VB.NET,F#,j#或任何其他.NET语言更轻松地完成工作。 到目前为止,我们有: 尾递归 通用协/反方差 仅在返回类型上有所不同的过载 覆盖访问修饰符 有一个不能从System.Object继承的类 过滤的异常(可以在vb.net中完成) 调用当前静态类类型的虚拟方法。 获取值类型的盒装版本的句柄。 尝试/故障。 禁止名称的用法。 为值类型定义自己的无参数构造函数。 用raise元素定义事件。 CLR允许某些转换,但C#不允许。 将非main()方法设为.entrypoint。 直接使用本机int和本机unsigned int类型。 玩瞬态指针 在MethodBodyItem中发出字节指令 抛出并捕获非System.Exception类型 继承枚举(未验证) 您可以将字节数组视为int数组(小4倍)。 您可以将字段/方法/属性/事件都具有相同的名称(未验证)。 您可以从其自己的catch块分支回try块。 您可以访问famandassem访问说明符(protected internal是fam 或 assem) 直接访问<Module>用于定义全局函数的类或模块初始化器。
165 c#  .net  clr  cil 

1
为什么C#编译器将此!=比较翻译为>比较?
我偶然发现C#编译器启用了此方法: static bool IsNotNull(object obj) { return obj != null; } …进入此CIL: .method private hidebysig static bool IsNotNull(object obj) cil managed { ldarg.0 // obj ldnull cgt.un ret } …或者,如果您希望查看反编译的C#代码,请执行以下操作: static bool IsNotNull(object obj) { return obj > null; // (note: this is not a valid C# expression) } 怎么把这些!=翻译成“ …
147 c#  cil  il  notnull  binary-operators 

5
Java的虚拟机和CLR
作为对MSIL和Java字节码之间差异的问题的一种跟进?,Java虚拟机的工作方式与Java虚拟机的主要(主要)区别或相似之处是什么.NET Framework 公共语言运行库(CLR)是否有效? 另外,是 .NET框架 CLR是“虚拟机”还是不具有虚拟机的属性?

9
动态替换C#方法的内容?
我想做的是更改C#方法在调用时的执行方式,以便我可以编写如下内容: [Distributed] public DTask<bool> Solve(int n, DEvent<bool> callback) { for (int m = 2; m < n - 1; m += 1) if (m % n == 0) return false; return true; } 在运行时,我需要能够分析具有Distributed属性(我已经可以做到)的方法,然后在函数主体执行之前和函数返回之后插入代码。更重要的是,我需要能够在不修改调用Solve或在函数开始的地方修改代码(在编译时;在运行时这样做才是目标)。 目前,我尝试了这段代码(假设t是Solve的存储类型,而m是Solve的MethodInfo): private void WrapMethod(Type t, MethodInfo m) { // Generate ILasm for delegate. byte[] il = …
108 c#  methods  assemblies  cil  swap 

3
为什么此条件(null ||!TryParse)会导致“使用未分配的局部变量”?
以下代码导致使用未分配的局部变量“ numberOfGroups”: int numberOfGroups; if(options.NumberOfGroups == null || !int.TryParse(options.NumberOfGroups, out numberOfGroups)) { numberOfGroups = 10; } 但是,此代码可以正常工作(尽管ReSharper说的= 10是多余的): int numberOfGroups = 10; if(options.NumberOfGroups == null || !int.TryParse(options.NumberOfGroups, out numberOfGroups)) { numberOfGroups = 10; } 我是否缺少某些东西,或者编译器不喜欢我的东西||? 我将范围缩小到dynamic导致问题的范围(options在我上面的代码中是一个动态变量)。问题仍然存在,我为什么不能这样做? 该代码无法编译: internal class Program { #region Static Methods private static void Main(string[] args) { …

4
简单基准测试中怪异的性能提升
昨天,我找到了Christoph Nahr撰写的名为“ .NET Struct Performance”的文章,该文章 对几种语言(C ++,C#,Java,JavaScript)的基准测试了一种添加两个点结构(double元组)的方法。 事实证明,C ++版本执行大约需要1000毫秒(1e9迭代),而C#在同一台机器上的时间不能低于3000毫秒(并且在x64中的表现甚至更差)。 为了自己进行测试,我使用了C#代码(并略微简化以仅调用按值传递参数的方法),并在i7-3610QM机器(单核3.1Ghz Boost),8GB RAM,Win8上运行了它。 1,使用.NET 4.5.2,RELEASE构建32位(由于我的OS是64位,因此x86 WoW64)。这是简化版本: public static class CSharpTest { private const int ITERATIONS = 1000000000; [MethodImpl(MethodImplOptions.AggressiveInlining)] private static Point AddByVal(Point a, Point b) { return new Point(a.X + b.Y, a.Y + b.X); } public static void Main() { Point …

3
MSIL方法中hidebysig的目的是什么?
使用ildasm和C#程序,例如 static void Main(string[] args) { } 给出: .method private hidebysig static void Main(string[] args) cil managed { .entrypoint // Code size 2 (0x2) .maxstack 8 IL_0000: nop IL_0001: ret } // end of method Program::Main hidebysig构造做什么?
92 cil 

7
在“ k + = c + = k + = c;”中对内联运算符有解释吗?
以下操作的结果如何解释? k += c += k += c; 我试图理解以下代码的输出结果: int k = 10; int c = 30; k += c += k += c; //k=80 instead of 110 //c=70 目前,我正在努力理解为什么“ k”的结果为80。为什么分配k = 40无效(实际上Visual Studio告诉我该值未在其他地方使用)? 为什么k为80,而不是110? 如果我将操作拆分为: k+=c; c+=k; k+=c; 结果是k = 110。 我试图浏览CIL,但我对解释生成的CIL并不了解,无法获得一些细节: // [11 13 - 11 24] IL_0001: …


19
CIL nop操作码的目的是什么?
我正在经历MSIL,并注意到MSIL中有很多nop指令。 MSDN文章说,如果对操作码进行了修补,它们将不采取任何措施,并被用于填充空间。在调试版本中使用的版本比发行版本更多。 我知道在汇编语言中会使用这些类型的语句来对齐后面的指令,但是为什么在MSIL中需要MSIL nop? (编者注:可接受的答案是关于机器代码NOP的,而不是问题最初询问的MSIL / CIL NOP。)
82 assembly  bytecode  cil 


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.