В настоящее время, единственный сценарий, в котором PostSharp ткет аспект вокруг места вызова, когда вы применяете этот аспект к способу в ссылочной сборке.
При применении аспекта в проекте вы можете установить имя внешней сборки в свойстве AttributeTargetAssemblies.
[Log(AttributeTargetAssemblies = "SomeLibrary", ...)]
PostSharp, конечно, не будет изменять существующую внешнюю сборку, вместо этого он будет плести аспект сборки вашего проекта вокруг звонков ссылочной сборки.
Применение аспекта к вызовам методов из одной и той же сборки в настоящее время не поддерживается. В большинстве сценариев это не требуется, или должно быть разумное обходное решение.
Возможно, мы сможем решить эту проблему, если вы предоставите более подробную информацию о синхронизированном методе и почему невозможно использовать перехват метода.
Обновление.
Возможным обходным путем является введение блокировок синхронизации с использованием аспектов. Вы можете написать обычай OnMethodBoundaryAspect или использовать SynchronizedAttribute из библиотеки шаблонов Threading.
Затем вы можете использовать Aspect Dependency or Aspect Priority, чтобы убедиться, что измерение аспекта введено перед аспектом резьбы. Таким образом, поведение будет таким же, как при введении аспекта измерения вокруг сайта вызова.
[Serializable]
[AspectTypeDependency(AspectDependencyAction.Order,
AspectDependencyPosition.Before,
typeof(SynchronizedAttribute))]
public class MeasureTimeAttribute : OnMethodBoundaryAspect
{
// ...
}
Почему вы не можете использовать MethodInterceptionAspect.OnInvoke (MethodInterceptionArgs арг) и поставить перед и после того, как вокруг арг. Продолжить? – RagtimeWilly
Я вызываю синхронизированный метод, и похоже, что Aspect также синхронизирован, если я использую MethodInterceptionAspect. Но код аспект не должен быть синхронизирован. – Ehler
Если ваша программа синхронизирована, вы можете обернуть все методы с помощью postsharp, но только хотите, хотите ли вы, когда условие действительно, например логическое значение, и установите условие true при вызове метода beforePart() и установите значение false при вызове afterPart(). –