2014-01-22 3 views
0

** Я использую PostSharp Express ... не уверен, что это повлияло бы на этот экземпляр.PostSharp AOP - Невозможно применить аспект к mscorlib Элементы System.IO.StreamReader

У меня есть OnMethodBoundary ->OnEntry аспект, который успешно Multicasts на уровне сборки для членов класса в моем собственном коде, но при попытке применить его к mscorlibSystem.IO.StreamReader членов, не кости. Основываясь на результатах поиска, которые я сделал на веб-сайте PostSharp, здесь, в SO, и в Google, я не могу сказать, какой правильный путь для этого - текущая версия PostSharp. Кто-нибудь знает? Надеюсь, я просто отсутствует что-нибудь простое: \

Вот аспект следует атрибут многоадресного Я использую:

namespace Test.Aspects { 
    [AttributeUsage(AttributeTargets.Assembly)] 
    [MulticastAttributeUsage(MulticastTargets.Method, AllowMultiple = false)]   
    [Serializable] 
    public class PatchStreamReaderAttribute : OnMethodBoundaryAspect { 
     public override void OnEntry(MethodExecutionArgs args) { 
      System.Threading.Thread.Sleep(1000); 
     } 
    } 
} 

[assembly: PatchStreamReader(AttributeTargetMembers = "ReadLine", AttributeTargetAssemblies = "mscorlib", AttributeTargetTypes = "System.IO.StreamReader")] 

ответ

2

Обычно, когда вы применяете аспект в данной сборке, PostSharp изменит эту сборку во время его процесса сборки. Это, конечно, не может произойти для mscorlib или, по сути, для любой третьей библиотеки сторон, которую вы ссылаетесь, но не строят из исходного кода.

Именно поэтому PostSharp использует другой подход при применении аспектов к ссылочным сборкам с использованием AttributeTargetAssemblies. Вместо изменения целевой 3-й партийной сборки PostSharp будет изменять вызовы с вашей сборки на целевую сборку.

Это, конечно же, дает вам меньше возможностей, где вы можете ввести свой код. Например, PostSharp может обнаруживать вызов метода библиотеки и вводить аспект вокруг этого вызова. Но вы не можете вводить аспект вокруг статического или экземпляра-конструктора типа из библиотеки.

При применении аспект необходимо обратить внимание и на имущество AttributeTargetTypes. Например, вы хотите применить аспект к вызовам метода StreamReader.ReadLine(). Этот виртуальный метод ReadLine() изначально объявлен в классе TextReader, а StreamReader переопределяет метод. Если вы посмотрите на IL, то вызов метода выглядит следующим образом:

callvirt instance string [mscorlib]System.IO.TextReader::ReadLine() 

Это означает, что необходимо установить AttributeTargetTypes свойство "System.IO.TextReader" применить аспект метода ReadLine().

+0

Имеет смысл, но даже если я изменю целевой элемент на метод, он все равно не работает. Я использую PostSharp Express, но я не видел ничего такого, что была отключена в этой версии. –

+0

Я обновил свой вопрос, чтобы лучше описать общий вопрос, который у меня есть. –

+1

Я обновил ответ. Вам необходимо установить 'AttributeTargetTypes' в класс" System.IO.TextReader ", который первоначально объявляет метод' ReadLine() '. – AlexD

Смежные вопросы