PostSharp переназначает запутанный код

Я использую NLog для создания разных регистраторов с разными уровнями ведения журнала для каждого класса. Каждое сообщение журнала содержит имя класса и метода.

Я также использую PostSharp для создания кода вокруг моих методов. Созданный код в основном получает регистратор для текущего класса и записывает логин.

Моя проблема в том, что мне нужно запутать мою программу и я хочу зарегистрировать незашифрованное имя класса.

После запутывания моей программы она работает правильно, но регистрирует запутанные имена классов.

Я искал в Интернете решения и нашел этот блог от PostSharp:

http://www.postsharp.net/blog/post/Whate28099s-New-in-PostSharp-21-Support-for-Obfuscation-%28Dotfuscator%29

Проблема в том, что я не понимаю, как я могу реализовать этот «шаг постобфускации (реализованный PostSharp)».

Я знаю, как создать файл проекта MSBuild и как запустить его с помощью MSBuild.exe, но я не знаю, что делают «PostSharp.AddIn.PostObfuscation.targets» и «PostObfuscationRemap» и как они выглядят.

Я надеюсь, что я правильно описал свою проблему, и что у кого-то из вас есть ответ на нее.


person Patrick    schedule 03.02.2014    source источник


Ответы (2)


Сообщение в блоге от PostSharp, которое вы нашли, на самом деле посвящено решению другой проблемы — несовместимости самого PostSharp 2.1 с инструментами обфускации. PostSharp 3.0+ уже совместим с инструментами запутывания, и запись в блоге не актуальна для этих более новых версий.

Ваша проблема в другом - я подозреваю, что ваш код ведения журнала обращается к имени класса во время выполнения и, таким образом, получает запутанное имя класса. Вы должны попытаться подготовить строку формата журнала во время компиляции и сохранить ее в поле аспекта. Таким образом, вы можете сохранить исходное имя класса в своей строке и получить к нему доступ во время выполнения.

[Serializable]
public sealed class TraceAttribute : OnMethodBoundaryAspect
{
    private string enteringMessage;

    public override void CompileTimeInitialize(MethodBase method, AspectInfo aspectInfo)
    {
        string methodName = method.DeclaringType.FullName + method.Name;
        this.enteringMessage = "Entering " + method.DeclaringType.FullName + method.Name;
    }

    public override void OnEntry(MethodExecutionArgs args)
    {
        Console.WriteLine(this.enteringMessage);
    }
}
person AlexD    schedule 06.02.2014
comment
Я попробовал ваш код сегодня, и с его помощью я могу использовать свои собственные аспекты и по-прежнему получать имена регистрируемых методов. - person Patrick; 10.02.2014

Спасибо за ответ, вы правы в том, что сообщение в блоге больше не актуально.

Сейчас я пробую более новую версию PostSharp, и теперь переназначение работает.

Но мой код не был проблемой. Мой код выглядит очень похоже. Я пропустил некоторые файлы, такие как файлы .psproj и GlobalAspect.cs. Я понял, что это была моя реальная проблема.

Я пропустил эти файлы, потому что не мог использовать NuGet для автоматической установки PostSharp, и NuGet обычно создает эти файлы сам по себе.

person Patrick    schedule 07.02.2014