Tag: cil

如何将“default(SomeType)”从C#翻译成CIL?

我目前正在处理涉及System.Reflection.Emit代码生成的问题。 我想弄清楚在C#中我会使用default(SomeType)地方发出什么CIL。 我从Visual Studio 11 Beta运行了一些基本实验。 JustDecompile向我显示以下CIL输出的default(bool) , default(string)和default(int? ?: .locals init ( [0] bool V_0, [1] string V_1, [2] valuetype [mscorlib]System.Nullable`1 V_2 ) // bool b = default(bool); ldc.i4.0 stloc.0 // string s = default(string); ldnull stloc.1 // int? ni = default(int?); ldloca.s V_2 initobj valuetype [mscorlib]System.Nullable`1 从这一点来看, default(T)似乎被编译器解析为给定类型的最合适的CIL。 我继续看看在更一般的情况下会发生什么,使用三种通用方法: T CreateStructDefault() where T […]

如何防止我的代码被盗?

当我启动.NET exe时会发生什么? 我知道C#被编译为IL代码,我认为生成的exe文件只是启动运行时并将IL代码传递给它的启动器。 但是怎么样? 它的过程有多复杂? IL代码嵌入在exe中。 我认为它可以从内存中执行而无需将其写入磁盘,而普通的exe不是(好的,是的,但它非常复杂)。 我的最终目标是提取IL代码并编写我自己的加密启动器,以防止scriptkiddies在Reflector中打开我的代码并轻松窃取我的所有类。 好吧,我无法完全阻止逆向工程。 如果他们能够检查内存并抓住我将纯IL传递给运行时的那一刻那么无论是否是.net exe都没关系,是吗? 我知道有几个混淆器工具,但我不想弄乱IL代码本身。 编辑:所以似乎不值得尝试我想要的东西。 无论如何他们都会破解它……所以我会寻找一个混淆工具。 是的,我的朋友也说,将所有符号重命名为无意义的名称就足够了。 毕竟逆向工程并不那么容易。

有没有办法查看由JITter为给定的C#/ CIL生成的本机代码?

在对这个答案的评论中(建议在整数乘法/除法中使用位移运算符,为了提高性能),我询问这实际上是否会更快。 在我的脑海中有一个想法,在某种程度上 ,某些东西将足够聪明,以确定>> 1和/ 2是相同的操作。 但是,我现在想知道这是否真的是真的,如果是,它会发生在什么级别。 测试程序为两种方法产生以下比较CIL( optimize开启),这两种方法分别对其参数进行划分和移位: IL_0000: ldarg.0 IL_0001: ldc.i4.2 IL_0002: div IL_0003: ret } // end of method Program::Divider 与 IL_0000: ldarg.0 IL_0001: ldc.i4.1 IL_0002: shr IL_0003: ret } // end of method Program::Shifter 所以C#编译器发出div或shr指令,而不是聪明。 我现在想看看JITter生成的实际x86汇编程序,但我不知道如何执行此操作。 它甚至可能吗? 编辑添加 发现 感谢您的回答,已接受来自nobugz的那个,因为它包含有关该调试器选项的关键信息。 最终对我有用的是: 切换到发布配置 在Tools | Options | Debugger Tools | Options | Debugger […]

通用FromEvent方法

使用新的async / await模型,生成一个在事件触发时完成的Task非常简单; 你只需要遵循这种模式: public class MyClass { public event Action OnCompletion; } public static Task FromEvent(MyClass obj) { TaskCompletionSource tcs = new TaskCompletionSource(); obj.OnCompletion += () => { tcs.SetResult(null); }; return tcs.Task; } 这允许: await FromEvent(new MyClass()); 问题是您需要为每个要await类中的每个事件创建一个新的FromEvent方法。 这可能会变得非常快,而且它主要只是样板代码。 理想情况下,我希望能够做到这样的事情: await FromEvent(new MyClass().OnCompletion); 然后我可以为任何实例上的任何事件重用相同的FromEvent方法。 我花了一些时间来尝试创建这样的方法,并且存在许多障碍。 对于上面的代码,它将生成以下错误: 事件’Namespace.MyClass.OnCompletion’只能出现在+ =或 – =的左侧 据我所知,没有办法通过代码传递这样的事件。 所以,下一个最好的事情似乎是尝试将事件名称作为字符串传递: await FromEvent(new […]