C# Dotfuscator中反射错误的解决方法?

C# Dotfuscator中反射错误的解决方法?,c#,.net,reflection,obfuscation,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();

大家好,

我正在调用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会在重命名过程中自动剥离属性(无论如何,这些属性只是元数据-真正的工作是由自动创建的get/set方法对完成的)。它还重命名了底层的get/set方法。根据您尝试执行的操作,您将需要从重命名中排除属性元数据本身或get/set方法(或可能同时排除两者)

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


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

您可以在ILSpy或Reflector中打开模糊程序集,并发布此类的模糊代码吗?天哪,这是个好主意。。。我必须把密码放在哪里?抱歉,我是新来的。从ILSpy中的代码来看,它似乎已将属性转换为两个函数调用,get和set各一个!这当然解释了为什么它说没有财产。但是接下来的工作是什么呢?@LonelyCoder:编辑你的问题并把它放进去就行了there@LonelyCoder:嗯,反射和模糊不匹配…:/谢谢,但是你能用表达式调用Type.GetProperties方法吗?这不是你使用表达式的原因。用表达式替换对属性的反射。这显然只适用于编译时已知属性的情况……我的属性在编译时已知,但我仍然需要使用Type.GetProperties类枚举它们,这就是为什么我要问这个问题。如果做不到,那就没有意义了,我需要反射来达到反射的目的。也许我们可以找到另一种方法。为什么需要枚举属性?我认为您正在对枚举的结果进行处理。是什么?嗨,你的回答很有帮助,谢谢。我需要阻止它将属性转换为方法。但仍必须更改属性名称。我将使用什么正则表达式来实现这一点?方法总是存在的,属性只是有用的语法糖。编写obj.Text=“hello”时,编译器将其转换为obj.setText(“hello”)。因为属性语法只是为了方便编码人员,如果您想实际使用反射以任何方式访问属性,我猜您几乎肯定会希望对get/set方法而不是属性元数据进行操作。一旦你有了一个属性列表,你到底想做什么?那么你能在IL代码中看到这个翻译吗?在Dotfuscator中,如果我只是检查要排除的属性(例如本例中的“Number”),而不是底层的get集,那么它就工作了。所以我似乎只需要排除某个名称空间中的所有公共属性。我正在使用反射进行自定义序列化,但请不要这样做。已经完成了,而且已经掸了灰尘。啊,好吧,有道理。在“重命名排除项”窗口中,添加类型规则。如果要排除的名称空间是MyNamespace,请将名称字段设置为MyNamespace\..*(即MyNamespace,一个转义句点,然后设置任何字符的0或更多)。取消选中排除类型复选框。下一步,右键单击刚刚创建的类型规则,然后选择“添加属性”。将名称字段设置为。*以选择该命名空间中的所有属性。