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 делает то, что ожидается.