Tag: il

IL中调用实例与newobj实例的区别

我正在深入研究C#,并使用可空的值类型。 出于实验目的,我写了一段代码: private static void HowNullableWorks() { int test = 3; int? implicitConversion = test; Nullable test2 = new Nullable(3); MethodThatTakesNullableInt(null); MethodThatTakesNullableInt(39); } 而且我被要求看到implicitConversion / test2变量初始化为: call instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) 指令,而当调用MethodThatTakesNullableInt时,我可以看到: IL_0017: initobj valuetype [mscorlib]System.Nullable`1 和 IL_0026: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) 我明白了。 我以为我也会看到用于implicitConversion / test2的 newobj指令。 这是完整的IL代码: .method private hidebysig static void HowNullableWorks() […]

条件属性如何工作?

我有一些标有[Conditional(“XXX”)]辅助方法。 目的是在仅存在XXX条件编译符号时使方法有条件地编译。 我们使用它来调试和跟踪function,它运行良好。 在我研究条件编译如何工作的过程中,我发现有几个来源说明用Conditional属性标记的方法将放在IL中,但是不会执行对方法的调用。 代码如何编译成IL而不执行? 如何validation行为实际上是如上所述? 我在IL方面做得不多,所以我的技能在这个方面都很弱。

使用Mono.Cecil替换对类型/命名空间的引用

背景(不必要,令人困惑,只为好奇) 我正在使用Unity3D for Mobile的免费版本,它不允许我在移动设备上使用System.Net.Sockets命名空间。 问题是我正在使用引用System.Net.Sockets已编译的.dll库(即IKVM)。 我实际上并没有使用引用System.Net.Sockets IKVM中的类,因此我没有购买3000美元的Unity Pro移动许可证,而是创建了一个名为dudeprgm.Net.Sockets的Sockets命名空间的存根库, dudeprgm.Net.Sockets替换了所有存根的类和方法(我使用Mono源代码完成此操作)。 我的问题 我需要将dll中的所有System.Net.Sockets.*引用替换为dudeprgm.Net.Sockets.* 。 我知道这样的事情是可能的并且由其他人完成 (参见下面的编辑 ,在页面底部) 。 我想知道自己该怎么做。 我能够使用Mono.Cecil提出以下代码。 它遍历所有IL指令,检查操作数是否为InlineType ,然后检查内联类型是否是System.Net.Sockets一部分,然后将其重命名为dudeprgm.Net.Sockets并写入。 **我不确定这是否是在Mono.Cecil中进行“查找和替换”的正确方法。 问题是,这并没有捕获所有Sockets使用(见下文)。 private static AssemblyDefinition stubsAssembly; static void Main(string[] args) { AssemblyDefinition asm = AssemblyDefinition.ReadAssembly(args[0]); stubsAssembly = AssemblyDefinition.ReadAssembly(“Socket Stubs.dll”); // … // Call ProcessSockets on everything // … asm.Write(args[1]); } /* * This will be […]

创建DynamicMethod为属性赋值?

这是一项学习练习。 我创建了一个方法,它接受一个Foo和一个字符串并设置A属性。 我使用Reflector反汇编来生成以下发射代码。 反汇编看起来像这样: .method private hidebysig static void Spork(class ConsoleTesting.Foo f, string ‘value’) cil managed { .maxstack 8 L_0000: ldarg.0 L_0001: ldarg.1 L_0002: callvirt instance void ConsoleTesting.Foo::set_A(string) L_0007: ret } 好的,所以我在之后建模了我的发射代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; using System.Reflection.Emit; namespace ConsoleTesting { class Foo { public string A { get; […]

IL的generics?

是否可以在IL Generator中使用generics? DynamicMethod method = new DynamicMethod( “GetStuff”, typeof(int), new Type[] { typeof(object) }); ILGenerator il = method.GetILGenerator(); … etc

动态生成IL中的值类型转换

更新 一年后,我终于意识到了这种行为的原因。 本质上,一个对象不能被拆箱到不同的类型(即使该类型转换或转换为目标类型),如果你不知道正确的类型,你必须以某种方式发现它。 赋值可能完全有效,但这不可能自动发生。 例如,即使一个字节适合Int64,也不能将字节拆分为long。 您必须将一个字节取消装入一个字节,然后再将其转换。 如果您没有足够的信息来执行此操作,则必须使用其他方法(如下所示)。 表征和身份 原始问题 我正在与IL合作,以提高通常使用reflection处理的许多任务的性能。 为了实现这一点,我大量使用DynamicMethod类。 我编写了动态方法来设置对象的属性。 这允许开发人员仅基于名称动态设置属性。 这对于将数据库中的记录加载到业务对象等任务非常有用。 但是,我坚持一个(可能很简单)的事情:转换值类型,甚至更大到更小的类型(例如将一个字节的值放入Int32)。 这是我用来创建动态属性设置器的方法。 请注意,我删除了除IL生成部分之外的所有内容。 // An “Entity” is simply a base class for objects which use these dynamic methods. // Thus, this dynamic method takes an Entity as an argument and an object value DynamicMethod method = new DynamicMethod( string.Empty, null, new […]

表达树生成的IL是否经过优化?

好吧,这只是好奇心,没有现实世界的帮助。 我知道使用表达式树,您可以像常规C#编译器一样动态生成MSIL。 由于编译器可以决定优化,我很想知道在Expression.Compile()期间生成的IL是什么情况。 基本上有两个问题: 因为在编译时编译器可以在调试模式和释放模式下产生不同的(可能是略微的)IL,在调试模式和发布模式下构建时通过编译表达式生成的IL是否存在差异? 此外,在运行时将IL转换为本机代码的JIT在调试模式和发布模式下都应该有很大的不同。 编译表达式也是如此吗? 或者来自表达树的IL根本没有被咬过? 我的理解可能有缺陷,请纠正我以防万一。 注意:我正在考虑分离调试器的情况。 我问的是Visual Studio中“debug”和“release”附带的默认配置设置。

cecil:Instruction.Operand类型对应于Instruction.OpCode.Code值

是否有任何文档或是否有一部分我可以参考的cecil源代码,以全面了解cecil将用于给定Code值的Operand类型? 例如:我可以从MethodBodyRocks收集Ldloc采用VariableDefinition类型的Operand ,但是我无法追踪其他一些指令代码。

将C#代码转换为IL代码

我如何获得C#代码的IL代码? 我可以使用extern库或内部函数吗? 编辑:我想用我的应用程序在MessageBox中显示IL代码。

C#生成IL for ++运算符 – 何时以及为什么前缀/后缀表示法更快

由于这个问题是关于增量运算符和带有前缀/后缀表示法的速度差异,我将非常谨慎地描述这个问题,以免Eric Lippert发现它并激怒我! (有关我所询问原因的更多信息和详细信息,请访问http://www.codeproject.com/KB/cs/FastLessCSharpIteration.aspx?msg=3899456#xx3899456xx/ ) 我有四个代码片段如下: – (1)单独,前缀: for (var j = 0; j != jmax;) { total += intArray[j]; ++j; } (2)单独,后缀: for (var j = 0; j != jmax;) { total += intArray[j]; j++; } (3)Indexer,Postfix: for (var j = 0; j != jmax;) { total += intArray[j++]; } (4)索引器,前缀: for (var j = […]