0

我有一个带有内部日志记录模块的类库,它Enum在命名空间级别使用一个来定义日志级别(调试、跟踪、错误等)。我在日志记录文本中使用这些枚举值的字符串转换。枚举被标记Friend(即,内部的,不公开的)。

当我最初运行混淆时,日志缺少枚举描述,我最终发现 Obfuscar 合理地混淆了枚举值,所以我添加了一个SkipEnum指令:

<Module file="$(InPath)\MyCompany.MyLibrary.dll">
  <SkipEnums type="MyCompany.MyLibrary.Logging.LogLevel" name="*" />
</Module>

更新:更正SkipEnumSkipEnums上面。我试过的代码有后一个元素,所以这不是问题。)

根据 Obfuscar 地图文件,这似乎没有做任何事情:

[MyCompany.MyLibrary]MyCompany.MyLibrary.Logging.LogLevel -> [MyCompany.MyLibrary] {unprintable obfuscated name}
{
    MyCompany.MyLibrary.Logging.LogLevel [MyCompany.MyLibrary]MyCompany.MyLibrary.Logging.LogLevel MyCompany.MyLibrary.Logging.LogLevel::Debug -> {unprintable obfuscated name}
    MyCompany.MyLibrary.Logging.LogLevel [MyCompany.MyLibrary]MyCompany.MyLibrary.Logging.LogLevel MyCompany.MyLibrary.Logging.LogLevel::Trace -> {unprintable obfuscated name}
    MyCompany.MyLibrary.Logging.LogLevel [MyCompany.MyLibrary]MyCompany.MyLibrary.Logging.LogLevel MyCompany.MyLibrary.Logging.LogLevel::Info -> {unprintable obfuscated name}
    ...
    MyCompany.MyLibrary.Logging.LogLevel [MyCompany.MyLibrary]MyCompany.MyLibrary.Logging.LogLevel MyCompany.MyLibrary.Logging.LogLevel::Off -> {unprintable obfuscated name}

    System.Int32 [MyCompany.MyLibrary]System.Int32 MyCompany.MyLibrary.Logging.LogLevel::value__ skipped:  special name
}

所以我尝试使用SkipTypewith skipEnums

<Module file="$(InPath)\MyCompany.MyLibrary.dll">
  <!--SkipType name="MyCompany.MyLibrary.Logging.LogLevel" skipEnums="true" /-->
</Module>

这有点奏效;它隐藏了枚举的名称(“LogLevel”),但没有隐藏枚举值本身。

所以我尝试SkipTypeskipFields

<Module file="$(InPath)\MyCompany.MyLibrary.dll">
  <!--SkipType name="MyCompany.MyLibrary.Logging.LogLevel" skipFields="true" /-->
</Module>

这行得通。

但是......当我检查生成的程序集时,以前隐藏/内部的命名空间MyCompany.MyLibrary.Logging被暴露了,我希望它保持隐藏。

这是一个错误吗?难道我做错了什么?虽然我认为该产品非常好,但 Obfuscar 的 doco 相当简陋,所以我不得不猜测其中的一些。

4

1 回答 1

0

SkipEnums 应按以下格式使用:

<SkipEnums value="true" />

这会跳过重命名所有枚举类型。但是,我无法成功按名称过滤。

于 2022-01-07T09:05:06.177 回答