Tag: il

除了generics类之外,还有其他方法可以调用结构的接口方法而不需要装箱吗?

请参阅代码段 public interface I0 { void f0(); } public struct S0:I0 { void I0.f0() { } } public class A where E :I0 { public E e; public void call() { e.f0(); } } 这是用于调用的IL代码() .maxstack 8 L_0000: ldarg.0 L_0001: ldflda !0 Temp.A`1::e L_0006: constrained !E L_000c: callvirt instance void Temp.I0::f0() L_0011: ret 参见约束的参考 约束前缀也可用于在值类型上调用接口方法,因为可以使用MethodImpl更改实现接口方法的值类型方法。 […]

为什么C# – > CIL在每条指令上都有标签?

在已编译的C#程序上使用ILDASM.exe时,它会显示方法中的每条指令都有一个标签。 例如: IL_0001: ldc.i4.4 IL_0002: stloc.0 IL_0003: ldc.r8 12.34 IL_000c: stloc.1 IL_000d: ldc.r8 3.1415926535897931 IL_0016: stloc.2 IL_0017: ldstr “Ehsan” IL_001c: stloc.3 IL_001d: ret 为什么是这样? 这样做效率不高或者CIL编译器本身是否优化这些标签?

遍历ac#方法和anazlye方法体

什么是在c#中遍历methodinfo的最简单方法? 我想遍历方法体并查找字段引用等,并检索类型。 在System.Reflection中有: mi.GetMethodBody().GetILAsByteArray() 这是一种低级别,在我能够穿越身体之前需要“一些”工作。 我知道Cecil存在,但在使用cecil加载内存程序集时出现问题。 我正在使用的程序集并不总是“在磁盘上”它可以是从例如编译的内存程序集中。 嘘,我不是一个干净的解决方案, 而无需将程序集临时写入磁盘。 还有什么其他选择呢?

如何使用csc(C#编译器)或dmcs(单声道C#编译器)生成IL源代码?

gcc有一个-s选项来生成汇编源代码。 csc(MS C#编译器)或dmcs(单声道C#编译器)是否具有等价性? 我的意思是那些编译器提供了一个选项来生成可以读取而不是执行二进制文件的IL源代码吗?

为什么在将C#代码编译成IL时会创建.ctor()?

使用这个简单的C#代码,我运行csc hello.cs; ildasm /out=hello.txt hello.exe csc hello.cs; ildasm /out=hello.txt hello.exe 。 class Hello { public static void Main() { System.Console.WriteLine(“hi”); } } 这是来自ildasm的IL代码。 .class private auto ansi beforefieldinit Hello extends [mscorlib]System.Object { .method public hidebysig static void Main() cil managed { .entrypoint // Code size 13 (0xd) .maxstack 8 IL_0000: nop IL_0001: ldstr “hi” IL_0006: […]

通用结构的大小

我需要找出一个通用结构的大小(我不能像sizeof(T)或使用Marshal.SizeOf(…)0>给我一个错误) 所以我写道: public static class HelperMethods { static HelperMethods() { SizeOfType = createSizeOfFunc(); } public static int SizeOf() { return SizeOfType(typeof(T)); } public static readonly Func SizeOfType = null; private static Func createSizeOfFunc() { var dm = new DynamicMethod(“SizeOfType”, typeof(int), new Type[] { typeof(Type) }); ILGenerator il = dm.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Sizeof); //needs to be il.Emit(OpCodes.Sizeof, […]

protobuf-net如何处理只读字段?

我使用protobuf-net来序列化/反序列化我的数据。 我有一些相当简单的类,所以这不是真正的问题。 据我所知,protobuf-net使用IL生成来创建序列化/反序列化代码。 虽然我的模型中只有字段,但我想知道如何用IL写入这样的字段? 我可以清楚地看到它运作良好,但我不知道为什么…… 我试图在代码中窥探它,但它有点太复杂了。 我自己尝试生成此类代码总是会导致ILvalidation程序错误。

Interlocked.CompareExchange 使用GreaterThan或LessThan而不是相等

System.Threading.Interlocked对象允许加法(减法)和比较作为primefaces操作。 似乎只是不做相等的CompareExchange,而且作为primefaces比较的GreaterThan / LessThan似乎是非常有价值的。 一个假设的Interlocked.GreaterThan会不会是IL的一个特性,还是一个CPU级function? 都? 缺少任何其他选项,是否可以在C ++或直接IL代码中创建这样的function并将该function公开给C#?

DynamicMethod比编译的IL函数慢得多

我写了一个复制公共属性的简单对象复制器。 我无法弄清楚为什么Dynamic方法比c#版本慢得多。 持续时间 C#方法:4,963毫秒 动态方法:19,924毫秒 请注意 – 当我在启动秒表之前运行动态方法时 – 持续时间不包括编译阶段。 我在调试和发布模式下,在x86和x64模式下运行,从VS和命令行运行,结果大致相同(动态方法慢400%)。 const int NBRECORDS = 100 * 1000 * 1000; public class Person { private int mSomeNumber; public string FirstName { get; set; } public string LastName { get; set; } public DateTime DateOfBirth { get; set; } public int SomeNumber { get { return […]

动态创建方法并执行它

背景: 我想在C#中定义一些static方法,并从运行时(在客户端上)选择的这些方法之一生成IL代码作为字节数组,并通过网络将字节数组发送到应该执行它的另一台机器(服务器)从字节数组重新生成IL代码之后。 我的尝试: ( POC ) public static class Experiment { public static int Multiply(int a, int b) { Console.WriteLine(“Arguments ({0}, {1})”, a, b); return a * b; } } 然后我得到方法体的IL代码,如: BindingFlags flags = BindingFlags.Public | BindingFlags.Static; MethodInfo meth = typeof(Experiment).GetMethod(“Multiply”, flags); byte[] il = meth.GetMethodBody().GetILAsByteArray(); 到目前为止,我没有动态创建任何东西。 但我把IL代码作为字节数组,我想创建一个程序集,然后是一个模块,然后是一个类型,然后是一个方法 – 所有这些都是动态的。 在创建动态创建方法的方法体时,我使用上面代码中使用reflection得到的IL代码。 代码生成代码如下: AppDomain domain = […]