Dotfuscator中的Reflection Bug的解决方法?

时间:2011-06-01 15:13:06

标签: c# .net reflection obfuscation

问候所有人,

我正在调用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”属性,那么它可以工作,但不会。但是,我不可能对我的项目中的所有属性执行此操作,因为这会导致可能的错误。

此方法有解决方法吗?或者甚至是我可以使用的其他“免费”混淆应用程序?

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

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

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

看看这个问题及其答案,知道我对“表达”的意思:How to raise PropertyChanged event without using string name