Dotfuscator中的Reflection Bug的解决方法?

问候所有,

我正在调用Type.GetProperties(),但是在运行Dotfuscator之后,它返回零项,之前它返回的值大于零。

public class Test { public int Number { get; set; } public void ShowInfo() { Type type = this.GetType(); PropertyInfo[] props = type.GetProperties(); Console.WriteLine("type [" + type.Name + "] props count: " + props.Length); } } 

如果我在Dotfuscator中重命名排除“Number”属性,那么它可以正常工作,但不会。 但是,我不可能对我的项目中的所有属性执行此操作,因为这会导致可能的错误。

这种方法有没有变通方法? 甚至可以使用其他“免费”混淆应用程序?

我已经尝试在他们的网站上查找提交错误,但我只使用社区版,所以似乎没有那么多的支持。

Dotfuscator在重命名期间自动剥离属性(无论如何都是元数据 – 真正的工作是由自动创建的get / set方法对完成)。 它还重命名底层的get / set方法。 根据您要执行的操作,您需要排除属性元数据本身或重命名的get / set方法(或可能两者)。

如果您需要保持属性元数据不变(例如,只是列出类型中的属性),您可以指示Dotfuscator通过在“重命名排除”选项卡上的树视图中检查属性或使用自定义正则表达式属性来排除重命名属性规则。 这将仅排除属性元数据 – 仍将重命名get / set方法。

如果你需要保留get / set方法(例如,因为你试图通过reflection来获取或设置属性的值),你可以通过在树视图中展开属性并检查来指示Dotfuscator从重命名中排除这些方法下面的get / set方法,或者使用自定义正则表达式方法规则。

由于混淆过程不仅限于重命名您的class级成员,因此您无法确定。 这就是混淆的问题:你基本上不能对你的类做出关于reflection结果的任何假设。 我能想到的唯一方法是不使用reflection而是使用表达式。

看看这个问题及其答案,知道我对“表达式”的意思: 如何在不使用字符串名称的情况下引发PropertyChanged事件