C# 禁用";常量字面值修剪“;在eazfouscator.NET中

C# 禁用";常量字面值修剪“;在eazfouscator.NET中,c#,.net,obfuscation,eazfuscator,C#,.net,Obfuscation,Eazfuscator,我想在eazfouscator.NET(程序集级)中禁用“常量文本修剪”。这怎么可能 背景: 我们在自定义属性构造函数中使用枚举。构造函数参数的类型为object,因为属性类位于不引用包含枚举的程序集的程序集中 在混淆之前: 混淆(反编译)后: 在属性的构造函数中,我将值强制转换为Enum。这会在模糊的程序集中生成异常,但在未模糊的变量中不会生成异常: public class MyAttribute : Attribute { public MyAttribute(object val

我想在eazfouscator.NET(程序集级)中禁用“常量文本修剪”。这怎么可能

背景: 我们在自定义属性构造函数中使用枚举。构造函数参数的类型为object,因为属性类位于不引用包含枚举的程序集的程序集中

在混淆之前:

混淆(反编译)后:

在属性的构造函数中,我将值强制转换为Enum。这会在模糊的程序集中生成异常,但在未模糊的变量中不会生成异常:

public class MyAttribute : Attribute
{
    public MyAttribute(object value)
    {
       var x = (Enum) value;    // this throws an InvalidCastException after obfuscation
    }
}

我是Frans的同事,我们想到了以下解决方案。 要将整数强制转换回其枚举值,必须传递枚举的类型

有什么想法吗

[myAttribute(“description”,param1:MyOwnEnum.myspecialrenumvalue,param2:MyOwnEnum.myspecialrenumvalue2,passedType:typeof(MyOwnEnum)]

内部类myAttribute:Attribute {


}

我是Frans的同事,我们想到了以下解决方案。 要将整数强制转换回其枚举值,必须传递枚举的类型

有什么想法吗

[myAttribute(“description”,param1:MyOwnEnum.myspecialrenumvalue,param2:MyOwnEnum.myspecialrenumvalue2,passedType:typeof(MyOwnEnum)]

内部类myAttribute:Attribute {


}

不能将整数强制转换为枚举基类

但是,您可能不需要禁用“常量文本修剪”。您可以将整数强制转换为特定的枚举类型,而不是强制转换为枚举基类型。 当枚举没有表示整数值的值时,也可以这样做

[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
    }
}

不能将整数强制转换为枚举基类

但是,您可能不需要禁用“常量文本修剪”。您可以将整数强制转换为特定的枚举类型,而不是强制转换为枚举基类型。 当枚举没有表示整数值的值时,也可以这样做

[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
    }
}

以下是如何使用eazfouscator.NET禁用枚举文字的剥离/修剪:

[模糊处理(Feature=“枚举值修剪”,Exclude=true)]
枚举样本枚举
{
没有一个
数字1,
数字2
}

这就是如何使用eazfouscator.NET禁用枚举文本的剥离/修剪:

[模糊处理(Feature=“枚举值修剪”,Exclude=true)]
枚举样本枚举
{
没有一个
数字1,
数字2
}

奇怪。int应始终可强制转换为基于int的枚举。可能是对象类型构造函数参数导致了问题。是否尝试将构造函数参数类型更改为该枚举?否则可能尝试强制转换两次:
(enum)(int)value
奇怪。int应始终可强制转换为基于int的枚举。可能是对象类型构造函数参数导致了问题。您是否尝试将构造函数参数类型更改为该枚举?否则您可能会尝试强制转换两次:
(enum)(int)value
嗨,Bart,我不能使用x1和x2,因为“属性类位于不引用包含枚举的程序集的程序集中”。实际上是eazfouscator.NET破坏了这些内容。在不进行混淆的情况下使用x1是没有问题的。我知道,@FransvanderVelden,但您可能可以使用双重强制转换(或者至少,对特定枚举类型的强制转换)作为EAZfousators behaviorHi Bart的一个变通方法,我不能使用x1和x2,因为“属性类位于不引用包含枚举的程序集的程序集中“。实际上是eazfouscator.NET破坏了一切。在不混淆的情况下使用x1是没有问题的。我知道,@FransvanderVelden,但您可能可以使用双重强制转换(或至少对特定枚举类型的强制转换)作为eazfouscator行为的解决方法
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)
}
[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
    }
}