Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 方法名是否编译到EXE中?_C#_Methods_Performance_Obfuscation_Cil - Fatal编程技术网

C# 方法名是否编译到EXE中?

C# 方法名是否编译到EXE中?,c#,methods,performance,obfuscation,cil,C#,Methods,Performance,Obfuscation,Cil,将Windows应用程序项目编译为EXE后,类、方法和变量的名称是否包含在MSIL中 对于模糊处理,名称越少,逆向工程就越困难 对于性能,名称越短,访问速度越快 e、 g.因此,如果通过名称调用方法: 保持名称简短,命名查找的性能更佳 使名称保持神秘,更难反编译 是的,他们有。我认为使用较短的名称不会带来显著的性能提升。增益无法克服可读性的损失。是的,它们在IL-fire中,您将看到它们。如果它们没有在IL中结束,您就无法将它们作为库进行构建。(是的,您可以像引用类库一样引用.exe文件。

将Windows应用程序项目编译为EXE后,类、方法和变量的名称是否包含在MSIL中

  • 对于模糊处理,名称越少,逆向工程就越困难
  • 对于性能,名称越短,访问速度越快
e、 g.因此,如果通过名称调用方法:

  • 保持名称简短,命名查找的性能更佳
  • 使名称保持神秘,更难反编译

是的,他们有。我认为使用较短的名称不会带来显著的性能提升。增益无法克服可读性的损失。

是的,它们在IL-fire中,您将看到它们。如果它们没有在IL中结束,您就无法将它们作为库进行构建。(是的,您可以像引用类库一样引用.exe文件。)

然而,这在JIT中一次就解决了

保持名称的可读性,以便将来能够维护代码。性能问题不太可能产生任何可测量的差异,如果您想混淆代码,请不要在源代码级别(您是读取代码的人)进行混淆-使用专门构建的混淆器进行混淆


编辑:至于包含的内容-为什么不启动Reflector或ildasm并找出答案?从内存中,您会丢失局部变量名(如果您构建了pdb文件,则会将其保存在pdb文件中),但仅此而已。私有方法名和私有变量名仍然存在。

MSIL中不包括局部变量。字段、方法、类等都是。
变量是基于索引的。

我认为它们是被添加的,但是名称的长度不会影响任何东西,因为函数名的查找方式。至于模糊处理,我认为有一些工具(Dotfuscator或类似的工具)基本上可以完全按照您所说的做。

成员名称确实包含在IL中,无论它们是私有的还是公共的。事实上,您的所有代码都包含在内,如果您使用Reflector,您实际上可以读取应用程序的所有源代码。剩下的就是调试这个应用程序,我想可能有工具可以实现这一点

如果您正在制作具有多个客户机和竞争对手的打包应用程序,那么您必须完全(我再强调也不为过)混淆您的代码。幸运的是,有许多模糊器可用

这是我对.Net的一个主要抱怨。既然微软在这方面做了很多艰苦的工作,为什么不开发(或收购)一个专业的混淆器,并将其作为VS.Dotfuscator的一部分呢?Dotfuscator只是不能解决这个问题,而不是他们为社区提供的版本

  • 名字要简短,这样更好 命名查找的性能
这有什么区别?我不确定VM是如何查找标识符的,但我很确定它没有进行直接的字符串比较查找。这可能是最糟糕的方法

  • 使名称保持神秘,更难反编译
老实说,我不认为代码混淆有多大帮助。大多数有能力的开发人员已经开发出了一种“第六感”来快速解决问题,即使像方法名称这样的标识符完全没有帮助,因为他们需要维护或改进的源代码通常已经存在这些问题(我指的是像“DoAllStuff()”这样的方法名称)


无论如何,如果您担心混淆问题,那么通过模糊实现安全通常是个坏主意。我测试了8种不同的模糊器,Reactor不仅是最便宜的商用模糊器,而且是同类产品中第二好的(最好的是最贵的,Dotfuscator Gold)

[编辑]


事实上,现在我想起来了,如果你所关心的只是混淆方法名,那么VS.NET附带的Dotfuscator Community Edition应该可以正常工作。

是否也包括私有成员名?JIT编译?!JavaScript不是这样执行的吗?如果你真的对.NET使用JIT编译感到惊讶的话,我建议你在使用C#之前在.NET上多读一些。是的,你可以对代码进行反向工程——你可以用任何语言(理论上)进行反向工程。您还可以混淆代码,因此并非所有.NET代码实际上都是开源的。虚拟方法表最初仅使用指向JIT编译器本身的指针填充,直到运行时首次调用该方法,然后JIT编译器找出方法代码的位置,并用实际代码的偏移量替换对JIT的调用。对于每台机器,这可能是不同的。。。。(con't)Don Box的书《Essential.Net》或Jeffrey Richter的《CLR via C#》中有一个很好的解释说明了所有这些是如何工作的,这也很好。正如Jon Skeet所说,“从内存中,你会丢失局部变量名……私有变量名仍然存在。”任何一个一年级的CS学生都可以使用.Net Reflector来理解你的代码。不混淆等同于将应用程序作为开源发布。开源对于许多商业应用程序来说并不实用。不管你如何混淆你的可执行文件,任何有能力的程序员都可以很容易地找到答案。您可以在运行时生成代码,这会稍微提高一点,但不会提高很多。就像大多数受拷贝保护的游戏在发布几天后被破解一样。不,我不认为混淆是不值得的。mhenry1384:不,不值得,因为它没有开源许可证。仅仅因为用户可以阅读(反编译的)代码,并不意味着他们可以合法地使用它。NET和本机代码之间的唯一区别是反编译的难度。首先确定您的威胁模型:您希望人们对Unbof做什么