заставить Obfuscar избегать переименования перечисляемых типов

При использовании Obfuscar я хочу предотвратить обфускацию перечислимых типов, потому что мне нужны исходные имена значений перечисления. Я вызываю ToString() для значений перечисления, потому что они полезны для пользователя. У меня возникли трудности с обычной конфигурацией, когда все типы обфусцированы, кроме тех, которые появляются в файле конфигурации с элементом <SkipType name="namespace.EnumType"/>. Я прибегаю к более пессимистическому методу использования <MarkedOnly />, который затемняет только то, что помечено аннотацией. Далее следует довольно минимальный файл конфигурации.

    <?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>

Аннотированный код:

namespace WpfApp
{
    public enum Category { Low, High }

    [System.Reflection.Obfuscation]
    public partial class MainWindow : Window
    {
        private ViewModel ViewModel;

        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this.ViewModel = new ViewModel();
        }

        private void MyButtonClick(object sender, RoutedEventArgs e)
        {
            this.ViewModel.Process(MyTextBox.Text);
        }
    }

    internal class ViewModel : WpfNotifier
    {
        private const float DefaultKilograms = 80.0f;

        private string _kilograms;
        public string Kilograms // WPF binds here
        {
            get { return this._kilograms; }
            set { this._kilograms = value; NotifyPropertyChanged(); }
        }
        private string _resultText;
        public string ResultText // WPF binds here
        {
            get { return this._resultText; }
            set { this._resultText = value; NotifyPropertyChanged(); }
        }

        internal void Process(string input)
        {
            float kilograms;
            if (Single.TryParse(input, out kilograms))
            {
                Category c = (kilograms > 100.0f) ? Category.High : Category.Low;
                this.ResultText = c.ToString();
            }
            else
            {
                this.Kilograms = ViewModel.DefaultKilograms.ToString();
            }
        }
    }

    public class WpfNotifier : INotifyPropertyChanged
    {
        [field: NonSerialized]
        public event PropertyChangedEventHandler PropertyChanged; // public for interface

        internal void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            else
                ; // it is harmless to fail to notify before the window has been loaded and rendered
        }
    }
}

Как вы можете видеть, только один тип помечен знаком [System.Reflection.Obfuscation], но, тем не менее, карта вывода показывает, что перечисление было переименовано. Тип перечисления называется Category.

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
}

Я неправильно использую или это ошибка?


person H2ONaCl    schedule 14.01.2015    source источник
comment
Значения перечислений хранятся как поля структуры, которую генерирует компилятор. Подозреваю, что их нужно исключить с помощью атрибута skipFields <SkipType name="Full.Namespace.And.TypeName4" skipFields="true" />. Похоже, что <MarkedOnly> заменяется на <HidePrivateApi>, который по умолчанию отмечает все частные / внутренние члены и классы. Хотя на данный момент я не понимаю, почему это скрывает общедоступное перечисление категорий, возможно, это связано с тем, что оно не раскрывается общедоступным методом и, следовательно, считается частным ...   -  person jessehouwing    schedule 14.01.2015
comment
Тесты в источнике предлагают несколько способов пропустить поля перечисления: <SkipField type='TestClasses.Enum1' name='*' /> - это один (который забывает имя типа перечисления, но сохраняет поля). См. Тесты SkipEnumtests в исходной папке: obfuscar.codeplex.com/downloads/get/670899   -  person jessehouwing    schedule 14.01.2015
comment
Я пробовал 4 варианта пропуска, и пока он не пропускает. Они находятся по этой ссылке stackoverflow.com/questions/27941434/   -  person H2ONaCl    schedule 14.01.2015


Ответы (1)


Обнаружена ошибка, связанная с параметром «MarkedOnly», из-за которого он не проверяется при обфускации полей и т. Д. Я только что исправил в ветке master.

https://github.com/lextm/obfuscar

Обратите внимание, что после этого изменения параметр «MarkedOnly» является эксклюзивным для других параметров. Если элемент (класс / перечисление / метод / поле и т. Д.) Не имеет прикрепленного атрибута Obfuscation, он останется прежним. Такие настройки, как KeepPublicApi и HidePrivateApi, игнорируются.

person Lex Li    schedule 17.01.2015