Tag: cil

为什么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编译器本身是否优化这些标签?

从PDB文件中检索本地变量名称

我正在尝试从IL字节码和PDB文件中检索源代码,我已经到了可以从IL生成源代码和reflection的地步我知道本地变量名的名称包含在pdb文件中。 我的问题是我怎样才能找到它? 应该用什么库来处理pdb文件(如果有的话)或者我应该自己编写代码? 我在哪里可以找到有关pdb文件格式的信息? 目前在生成的源代码中我使用自动生成的局部变量值,但我想改变它,因为我相信如果您有pdb文件可以找回该信息。 我试图在谷歌上看,但我没有找到任何有用的信息。 在此先感谢您的回复;)

方法名称是否编译到EXE中?

在将 Windows应用程序项目编译为EXE后,类,方法和变量名称是否包含在MSIL中 ? 对于混淆 – 更少的名称,更难逆向工程。 而对于性能 – 更短的名称,更快的访问。 例如 ,如果通过名称调用方法: 保持名称简短 ,更好的命名查找性能。 保持名称神秘 ,反编译更难。

在动态事件处理程序中引用’this’

在我的’myClass’类中,我使用Reflection.Emit为myClass类的一个成员动态编写一个事件处理程序。 我成功完成了这个。 现在,我想修改事件处理程序以调用myClass类中的一个实例方法。 但是,我无法弄清楚如何使用Reflection.Emit将对’this’的引用推送到MSIL堆栈。 在事件处理程序中,Ldarg_0不是对“this”的引用,而是事件处理程序的第一个参数。 有没有人知道如何在堆栈上推送’this’的引用,以便我可以调用实例方法。 例如,这就是我希望c#代码看起来像: public class myClass { private myObj1 obj1; public myClass() { this.init(); } private void init() { obj1.myEvent += new myEvent_EventHandler(theHandler); } private void theHandler(myObj2 obj2, myObj3 obj3) { // this is the part I’m having trouble with this.myFunction(obj2); } private void myFunction(myObj2 obj2) { // irrelevant } } […]

如何防止MSIL运行时注入?

如此处所示的程序化MSIL注入或此处http://www.codeproject.com/Articles/463508/NET-CLR-Injection-Modify-IL-Code-during-Run-time您可以使用一些棘手的注入在运行时修改IL代码。 我的问题是:如何预防? 例如,如果有人使用它来绕过安全function,我该如何避免安全漏洞?

将对象文字提供给ILGenerator

Food obj = …; ILGenerator gen = (…).GetILGenerator(); gen.Emit( ?? obj ?? ); // replace this gen.Emit(OpCodes.Call, typeof(Person).GetMethod(“Eat”)); 显然不可能干净地将obj推到评估堆栈上,但我对丑陋的黑客持开放态度,这可能会影响可移植性。 ModuleBuilder.DefineInitializedData允许在.sdata中存储System.Byte []。 有任何想法吗? 编辑:生成的方法作为新程序集的一部分发出。

当我将一个类声明为内部时,为什么IL将其显示为私有?

如果我将一个类声明为内部类,为什么IL将其显示为私有? internal class Thing .class private auto ansi beforefieldinit Thing.Thing extends [mscorlib]System.Object

有没有办法计算执行的IL指令的数量?

我想对C#进程进行基准测试,但我不想将时间用作向量 – 我想计算在特定方法调用中执行的IL指令的数量。 这可能吗? 编辑我不是指方法体的静态分析 – 我指的是执行的实际指令数 – 例如,如果方法体包含一个循环,那么计数会因许多指令而增加循环*迭代循环的次数。

Mono.Cecil是否负责分支机构等位置?

那么这个问题可能看起来很奇怪,但很简单 – 我的观点是,如果我在反编译代码中有一个“goto”(brtrue等),例如 br IL_0003 call ***** IL_0003: ret 然后我在****调用之后添加一个命令,将顶点处的br恢复为应该或该代码。 塞西尔是单独做的还是我必须照顾所有这些分支? :/它不是很难修复它们但是如果Cecil没有那么我根本就不会启动这个项目,我没有时间(或知识)获得高级IL魔法:P (是的我知道它不会是IL_0003只是例如)

F#“​​非托管”类型约束的行为

F#支持“非托管”的类型约束。 这与“struct”约束之类的值类型约束不同。 MSDN注意到非托管约束的行为是: 提供的类型必须是非托管类型。 非托管类型是某些基本类型(sbyte,byte,char,nativeint,unativeint,float32,float,int16,uint16,int32,uint32,int64,uint64或decimal),枚举类型,nativeptr 或非通用结构,其字段都是非托管类型。 这是一个非常方便的约束类型,在进行平台调用时,我不止一次希望C#有办法做到这一点。 C#没有这个约束。 C#不支持可在CIL中指定的所有约束。 一个例子是枚举。 在C#中,你不能这样做: public void Foo(T bar) where T:enum 但是,如果在另一个库中遇到它,C#编译器确实遵守“枚举”约束。 Jon Skeet能够用它来创建他的无约束旋律项目。 所以,我的问题是,F#的“非托管”约束是什么,可以在CIL中表示,就像一个枚举约束,只是没有暴露在C#中,或者它是纯粹由F#编译器强制实施的,就像F#支持的其他一些约束(如明确的成员约束)?