Dotfuscator WP7 edition и EnumExtention: дружба не сработала

В нашем приложении у нас есть расширение для 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 is: true и _false is: false"

Но после того, как Дотфускатор поработал над кодом, мы получаем следующее:

"Упс! MethodNotFoundException"

И все функции установлены на Да

Версия Dotfuscator: PreEmptive ver4.9.7000 WindowsPhoneEdition

Что не так с расширением?

PS извините за мой английский.

1 ответ

Решение

Отказ от ответственности: мой опыт работы с настольной версией dotfuscator, а не с версией телефона.

Dotfuscator может принять решение заменить определения перечисления эквивалентными значениями констант везде, на которые ссылается перечисление, тем самым устраняя необходимость в типе перечисления.

Попробуйте использовать настройки Dotfuscator, чтобы освободить перечисление от запутывания, или используйте следующие атрибуты перечисления:

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

... и затем, если это работает, попробуйте разрешить переименование, но не удаление, используя только второй атрибут.

После запутывания проверьте с IL DASM, чтобы увидеть, присутствует ли тип enum и что этот dotfuscator делает то, что ожидается.

Другие вопросы по тегам