C# 使Obfuscar避免重命名枚举类型

C# 使Obfuscar避免重命名枚举类型,c#,enums,obfuscar,C#,Enums,Obfuscar,在使用Obfuscar时,我希望防止对枚举类型进行模糊处理,因为我需要原始的枚举值名称。我对枚举值调用ToString(),因为它们对用户很有用。我在通常的配置中遇到了困难,除了那些出现在配置文件中带有元素的类型之外,所有类型都被模糊化了。我使用的是可能更为悲观的方法,即使用,它只会混淆用注释标记的内容。下面是相当小的配置文件 <?xml version="1.0"?> <configuration> <startup><s

在使用Obfuscar时,我希望防止对枚举类型进行模糊处理,因为我需要原始的枚举值名称。我对枚举值调用
ToString()
,因为它们对用户很有用。我在通常的配置中遇到了困难,除了那些出现在配置文件中带有
元素的类型之外,所有类型都被模糊化了。我使用的是可能更为悲观的方法,即使用
,它只会混淆用注释标记的内容。下面是相当小的配置文件

    <?xml version="1.0"?>
    <configuration>

      <startup><supportedRuntime version="v4.0"
             sku=".NETFramework,Version=v4.0,Profile=Client"/>
      </startup>

      <Obfuscator>

        <Var name="InPath"  
value="\users\user\documents\visual studio 2013\projects\wpfapp\wpfapp\bin\debug" />
        <Var name="OutPath" 
value="\users\user\documents\visual studio 2013\projects\wpfapp\wpfapp\bin\debug" />

        <Module file="$(InPath)\wpfapp.exe" />

        <Var name="KeepPublicApi" value="true" />
        <Var name="HidePrivateApi" value="true" />

        <Var name="MarkedOnly" value="true" />

      </Obfuscator>

    </configuration>
正如您所见,只有一种类型用
[System.Reflection.Obfuscation]
注释,但输出映射显示枚举已重命名。枚举类型称为
类别

Renamed Types:

[WpfApp]WpfApp.Category -> [WpfApp]A.a
{
    WpfApp.Category [WpfApp]WpfApp.Category WpfApp.Category::Low -> A
    WpfApp.Category [WpfApp]WpfApp.Category WpfApp.Category::High -> a

    System.Int32 [WpfApp]System.Int32 WpfApp.Category::value__ skipped:  special name
}

我的用法是错误的还是一个错误?

在“仅标记”选项周围发现了一个错误,在混淆字段等时无法检查该错误。我刚把它修好在总店


请注意,此更改后,“MarkedOnly”选项仅限于其他选项。如果元素(class/enum/method/field等)没有附加
模糊处理
属性,它将保持不变。“KeepPublicApi”和“HidePrivateApi”等设置将被忽略。

枚举值存储为编译器生成的结构的字段。我怀疑您需要使用
skipFields
atribute
排除它们。看起来
覆盖,默认情况下标记所有私有/内部成员和类。虽然我现在还不明白为什么它会混淆公共类别枚举,但这可能是因为它不是由公共方法公开的,因此被认为是私有的……源代码中的测试提供了许多跳过枚举字段的方法:
是一种(它忘记了枚举类型的名称,但保留了字段)。请参阅source drop中的SkipEnumtests:我尝试了4种不同的跳过,到目前为止,它没有跳过。他们在这个链接上
Renamed Types:

[WpfApp]WpfApp.Category -> [WpfApp]A.a
{
    WpfApp.Category [WpfApp]WpfApp.Category WpfApp.Category::Low -> A
    WpfApp.Category [WpfApp]WpfApp.Category WpfApp.Category::High -> a

    System.Int32 [WpfApp]System.Int32 WpfApp.Category::value__ skipped:  special name
}