我的问题是用于重命名的 Dotfuscator 配置。想象一个看起来像这样的类:

Class MyClass
{
    private int _propertyA;
    private int _propertyB;

    public int PropertyA
    {
        get{return _propertyA;}
        set{_propertyA = value;}
    }

    [Obfuscation(Feature = "renaming", Exclude = true)]
    public int DestinationReference
    {
        get{return _propertyB;}
    }
}

混淆的类将被写入这样的东西
Class a
{

    int s()
    void z(int a)

    public int DestinationReference
    {
        get{return _propertyB;}
    }
}

这是我使用 .Net Reflector 所看到的假设

我的问题如下:
- 在我们的代码中,我们实现了一个使用反射查找类的所有属性以查找特定参数的方法
- 此方法在混淆代码中不起作用,因为我的访问器 PropertyA 已被 get 访问器和 set 访问器的两种不同方法替换。
- 我知道,如果我从重命名中排除访问器,它会在 msil 代码中保留一个访问器,并且会被我查找访问器的方法找到

我的问题是:
- 重命名不是唯一的选择吗?
- Dotfuscator 中是否有允许重命名访问器而不将其拆分为两个不同的方法并丢失访问器的参数?

我对混淆很陌生,所以请原谅我的不完美,这是我可以看到的类似于上面在反射器中描述的类的内容。

如您所见,从重命名中排除的属性仍然是带有 get 访问器的属性。但是对于另一个被混淆的方法,我可以看到两种不同的方法 s 和 z

我想看看是否有办法获得单个访问器,例如使用基础 getter 和 setter 重命名为“s”

最佳答案

我找到了我的问题的一些答案,首先是在看了这篇文章之后:http://vicky4147.wordpress.com/2007/10/23/exploring-msil-properties/

我看到 MSIL 生成 get_XXX() 方法和 set_XXX(int) 方法以及添加属性。 Dotfuscator 负责重命名 get 和 set 方法(这是我们想要的),但也负责删除属性本身(我不想要)

一种解决方案是为混淆的 DLL 启用“库模式”,如果启用了库模式,文档说明:



这可以在反射器中进行混淆后看到,顶部库模式被禁用,底部库模式被启用

可以看出,没有任何公共(public)类/方法/字段被重命名,对我来说更重要的是属性元数据被保留了下来。

现在我的下一个问题是,如何保留属性元数据但允许重命名属性本身。我想找到一个令人满意的解决方案,而不必手动定义使用自定义混淆属性来装饰每个属性。

我会继续寻找另一天,如果我找不到任何东西,会将这个答案标记为问题的解决方案。

关于c# - Dotfuscator 访问器重命名 get 和 set,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25857766/

10-12 05:11