仍在基于修改 ILAsm 文件开发我的混淆程序。(参考。不应混淆哪些 C# 方法名称?)
在查看 ILAsm 代码时,我得到的印象是 .property 语句不用于任何事情,至少不用于程序执行。我是否认为他们只是为 Visual Studio 提供元数据?如果是这样,当 ILAsm 代码仅用于生成永远不会与 Visual Studio 一起使用的生产模块时,是否可以简单地删除它们?
仍在基于修改 ILAsm 文件开发我的混淆程序。(参考。不应混淆哪些 C# 方法名称?)
在查看 ILAsm 代码时,我得到的印象是 .property 语句不用于任何事情,至少不用于程序执行。我是否认为他们只是为 Visual Studio 提供元数据?如果是这样,当 ILAsm 代码仅用于生成永远不会与 Visual Studio 一起使用的生产模块时,是否可以简单地删除它们?
您是正确的,将某些东西声明为属性这一事实不会影响程序执行。正如《Inside Microsoft .NET IL Assembler 》一书在其关于属性的章节的介绍中所说,JIT 编译器和执行引擎完全不知道属性,并且没有任何 IL 指令提及属性概念。
请注意,Visual Studio 不是元数据的唯一使用者。如果您剥离.property
并重新组装,您将拥有 getter 和 setter 方法,但它显然不再是一个属性。这成为问题的最明显示例:如果一个对象的实例被移交给另一个使用反射来调用类上的每个属性的方法怎么办?由于建议的混淆方法,将找不到属性并且运行时行为已更改。
当然,反射和序列化等场景是混淆工具的常见问题,正如您在上一个问题中所讨论的那样。所以,我的意思是,它是有问题的,但它在与您在其他线程中讨论的场景类似的一组场景中存在问题——特别是那些在运行时使用元数据或执行序列化的场景。
我上面提到的这本书的最新版本有一个不同的名称:Expert .NET 2.0 IL Assembler;它可能对您有用。 为 .NET 公共语言运行时进行编译也可能很有价值。