在我们的应用程序中,我们有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”
但是Dotfuscator在编写代码后,我们获得了以下内容:
“糟糕!MethodNotFoundException”
并且所有功能都设置为是
Dotfuscator版本:PreEmptive ver4.9.7000 WindowsPhoneEdition
扩展有什么问题?
P.S。对不起我的英文。
答案 0 :(得分:1)
免责声明:我的经验是dotfuscator的桌面版,而不是手机版。
Dotfuscator可能决定用引用枚举的每个地方的等效常量值替换枚举定义,从而消除了对枚举类型的需要。
尝试使用Dotfuscator设置来免除枚举的混淆,或在枚举上使用以下属性:
[Obfuscation(Exclude=true, ApplyToMembers=true, StripAfterObfuscation=true, Feature="renaming"]
[Obfuscation(Exclude=false, ApplyToMembers=true, StripAfterObfuscation=true, Feature="conditionalinclude")]
...然后如果可行则尝试允许重命名,但不能仅使用第二个属性来删除。
在使用ILDASM进行模糊检查后,查看枚举类型是否仍然存在,以及dotfuscator是否按预期进行操作。