Dotfuscator中反射错误的解决方法

本文关键字:解决 方法 错误 反射 Dotfuscator | 更新日期: 2023-09-27 17:58:14

大家好,

我正在调用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"属性的重命名,那么它可以工作,但除此之外就不行了。然而,我不可能对项目中的所有属性都这样做,因为这可能会导致错误。

这种方法有什么变通办法吗?或者我可以使用的其他"免费"模糊处理应用程序?

我已经尝试过在他们的网站上提交一个bug,但我只使用社区版,所以似乎没有那么多支持它。

Dotfuscator中反射错误的解决方法

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

如果需要保持属性元数据的完整性(例如,只需在类型中列出属性),可以指示Dotfuscator通过在"重命名排除项"选项卡上的树视图中检查属性或使用自定义regex属性规则来排除重命名属性。这只会排除属性元数据-get/set方法仍将被重命名。

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

由于模糊处理的过程并不局限于重命名类成员,因此您不能确定这一点。这就是混淆的问题:对于反射的结果,你基本上不能再对你的类做出任何假设了。我唯一能想到的方法就是不使用反思,而是使用表达。

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