2

我在 xaml 文件中有一个按钮,在某些情况下应该隐藏。

这里是:

<Button Visibility="{Binding Path=ShowMyButton}"/>

绑定工作完美,直到混淆我的代码。

在 AssemblyInfo.cs 中,我添加了以下程序集注释:

[assembly: ObfuscateAssemblyAttribute(false, StripAfterObfuscation = false)]

顺便说一句,我使用 Eazfuscator.NET

混淆代码后,按钮始终可见,即绑定不再起作用。

我在 ShowMyButton 属性中添加了以下注释:

[ObfuscationAttribute(Exclude=true)]
public bool ShowMyButton
{
     get
     {
         return _showMe;
     }
     set
     {
         _showMe= value;
         OnPropertyChanged("ShowMyButton");
     }
}

此排除工作正常,但我有 3 个问题:

  1. 为什么 xaml 在混淆方面会感到困惑。我可以告诉混淆器不要混淆引用 xaml 文件中的绑定的方法吗?
  2. 根据 msdn ObfuscateAssemblyAttribute 仅区分公共和私有方法。手动排除所有在 xaml 文件中引用绑定的方法会非常令人沮丧(我的应用程序中有几十个)。有自动选项吗?

  3. 有没有办法告诉混淆器只混淆应用程序中的特定方法,即默认情况下请不要混淆任何东西,直到我告诉你这样做。

4

4 回答 4

2

这里的问题与 XAML 无关。问题在于您的INotifyPropertyChanged; 强调为什么字符串类型是一个坏主意。混淆器正在重命名ShowMyButton它用作方法的任何地方,但它不会重命名字符串的出现:

OnPropertyChanged("ShowMyButton");

混淆后,触发的更新事件会说属性“ShowMyButton”已更新,但实际属性已重命名为混淆值,因此任何依赖此接口的代码,包括 XAML 的数据绑定都不会正确更新,始终显示布尔值的默认值:true。

一个对重构更友好的实现使用表达式而不是字符串类型,因此有问题的行可以重写为

OnPropertyChanged(() => this.ShowMyButton);

这种模式的一种可能实现。

于 2013-01-11T16:34:13.127 回答
2

这是一个已知问题,在最新版本的 Eazfuscator.NET 中得到修复。

于 2013-02-07T09:08:29.160 回答
2

尝试 Babel for .net 并在http://babelfor.net/上查看它对 XAML 的混淆非常好。另请注意,Eazfuscator 很容易通过 de4dot 和 ILSpy 的组合进行反混淆。而且它对变量和值的重命名非常简单,ILSpy 可以揭示一切。

另一方面,Babel 添加了循环、迭代、开关,这些都可能使破解者感到困惑,并使任何反混淆的代码不可读和不可追踪。它还可以加密字符串和整个方法,使它们不可读。

于 2017-09-07T12:08:26.373 回答
1

如果混淆器混淆了ShowMyButton属性,但没有在编译的 XAML 中重命名它,则绑定没有目标,因为它仍然是目标ShowMyButton,而不是混淆的版本。

于 2013-01-11T16:28:50.773 回答