我想在Eazfuscator.NET(程序集级别)中禁用“常量文字修剪”。这怎么可能?
背景 我们在自定义属性构造函数中使用枚举。构造函数参数的类型是object,因为属性类位于不引用包含枚举的程序集的程序集中。
在混淆之前:
[MyAttribute(MyEnum.Value3)]
public class MyClass
{
}
混淆(反编译)后:
[MyAttribute(2)]
public class MyAttribute : Attribute
{
}
在属性的构造函数中,我将值转换为Enum。这会在模糊处理程序集中生成异常,但不会在未经模糊处理的变体中生成:
public class MyAttribute : Attribute
{
public MyAttribute(object value)
{
var x = (Enum) value; // this throws an InvalidCastException after obfuscation
}
}
答案 0 :(得分:0)
我是Frans的同事,我们想到了以下解决方案。 为了能够将整数强制转换回其枚举值,您必须传递枚举的类型。
有什么想法吗?
[myAttribute(" description",param1:MyOwnEnum.MyParticularEnumValue,param2:MyOwnEnum.MyParticularEnumValue2,passedType:typeof(MyOwnEnum)]
内部类myAttribute:属性 {
public myAttribute(string description, object param1, object param2, Type passedType)
{
this.myAttributeDescription = description;
this.SomePropertyWhichIsAnEnum = (Enum)Enum.ToObject(passedType, param1));
this.SomeOtherPropertyWhichIsAnEnum = (Enum)Enum.ToObject(passedType, param2)
}
}
答案 1 :(得分:0)
您不能将整数强制转换为Enum基类。
但是,您可能不需要禁用“常量文字修剪”。您可以将整数强制转换为特定的枚举类型,而不是强制转换为枚举基类型。 当枚举没有表示整数值的值时,这也有效。
[MyAttribute(MyEnum.Value3)]
public class MyClass1
{
//...
}
[MyAttribute(2)]
public class MyClass2
{
//...
}
[MyAttribute(123456)]
public class MyClass4
{
// MyEnum does not have a value with 123456
// but it still works
}
public class MyAttribute : Attribute
{
public MyAttribute(object value)
{
var x1 = (MyEnum)value; // works with enum and number
var x2 = (Enum)(MyEnum)value; // works (but why would you?)
var x3 = (Enum) value; // this throws an InvalidCastException after obfuscation
}
}
答案 2 :(得分:0)
这是使用Eazfuscator.NET禁用枚举文字的剥离/修剪的方法:
[Obfuscation(Feature = "enum values pruning", Exclude = true)]
enum SampleEnum
{
None,
Digit1,
Digit2
}