0

在我们的应用程序中,我们对 Enum 进行了扩展

namespace System
{
    /// <summary>
    /// Contains extention methods for emuns.
    /// </summary>
    public static class EnumExtention
    {
        /// <summary>
        /// Check is value has flag.
        /// </summary>
        /// <param name="value">Checked value</param>
        /// <param name="checkedFlag">Checked flag.</param>
        /// <returns>True if enum contains specified flag. Otherwise false</returns>
        public static bool HasFlag(this Enum value, Enum checkedFlag)
        {
            ulong num = Convert.ToUInt64(checkedFlag);
            ulong num2 = Convert.ToUInt64(value);
            return (num2 & num) == num;
        }
    }
}

在项目的某个地方,我们有一些 Enum 和一些 Func

[Flags]
public enum MyEnum
{
   zero= 0,
   two = 2,
   three = 3,
   threetwo = two | three 
}

public void SomeFunc()
{
   var ThreeTwo = Myenum.threetwo;

   bool _true = ThreeTwo.HasFlag(Myenum.three);
   bool _false = ThreeTwo.HasFlag(Myenum.zero);
   System.Windows.MessageBox.Show(String.Format("_true is: {0} and _false is : {1}", _true, _false);
 }

public void СallerFunction()
{
   try
   {
      SomeFunc();
   }
   catch (Exception ex)
   {
      System.Windows.MessageBox.Show(String.Format("Oops! {0}"), ex.Message));
   }
}

在发布模式下构建后,一切都很好,我们得到了这个:

“_true 是:true 和 _false 是:false”

但是在 Dotfuscator 处理代码之后,我们得到了以下信息:

“糟糕!MethodNotFoundException”

并且所有功能都设置为是

Dotfuscator 版本:PreEmptive ver4.9.7000 WindowsPhoneEdition

扩展有什么问题?

PS对不起我的英语。

4

1 回答 1

1

免责声明:我的经验是使用桌面版 dotfuscator,而不是手机版。

Dotfuscator 可能决定在引用枚举的任何地方用等效的常量值替换枚举定义,从而消除对枚举类型的需要。

尝试使用 Dotfuscator 设置使枚举免于混淆,或在枚举上使用以下属性:

[Obfuscation(Exclude=true, ApplyToMembers=true, StripAfterObfuscation=true, Feature="renaming"]
[Obfuscation(Exclude=false, ApplyToMembers=true, StripAfterObfuscation=true, Feature="conditionalinclude")]

...然后如果可行,请尝试仅使用第二个属性来允许重命名但不允许删除。

在使用 ILDASM 进行混淆检查以查看枚举类型是否仍然存在以及该 dotfuscator 是否执行预期的操作之后

于 2012-07-06T12:19:21.607 回答