【发布时间】:2014-05-12 18:02:29
【问题描述】:
我的 C# 项目引用了一个外部 .NET 程序集。我想在从我的项目到该程序集的每个调用周围插入锁定语句。我一直在尝试使用 PostSharp 来建立这一点,但找不到办法。我有外部程序集的源代码,我可能可以通过在其中插入方面来最简单地实现我的目标,但我更喜欢非侵入式解决方案,我可以保持外部程序集不受影响。
方法 1
我发现我可以包装对外部程序集的调用。遗憾的是,PostSharp 无法包装对抽象方法的调用,接口成员是抽象方法。因此这种方法不包括通过接口类型的调用。
[assembly: WrappingAspect(
AttributeTargetAssemblies = "Library",
AttributeTargetExternalMemberAttributes = MulticastAttributes.NonAbstract)]
[Serializable]
internal class WrappingAspect : OnMethodBoundaryAspect {
public override void OnEntry(MethodExecutionArgs args) {
Monitor.Enter(SyncRoot);
}
public override void OnExit(MethodExecutionArgs args) {
Monitor.Exit(SyncRoot);
}
}
方法2
也许我可以包装我的项目中所有引用外部程序集中类型的方法。我正在按照下面的思路思考。但是,我不能尝试这个,因为 ReflectionSearch 需要我目前没有的 PostSharp 许可证。
[assembly: WrappingAspect]
[Serializable]
internal class WrappingAspect : OnMethodBoundaryAspect {
public override void OnEntry(MethodExecutionArgs args) {
Monitor.Enter(SyncRoot);
}
public override void OnExit(MethodExecutionArgs args) {
Monitor.Exit(SyncRoot);
}
public override bool CompileTimeValidate(MethodBase method) {
return ReflectionSearch.GetDeclarationsUsedByMethod(method)
.Any(r => r.UsedType.Assembly.FullName.StartsWith("Library"));
}
}
问题
- 是否有一种非侵入式的方式来包装对外部程序集的所有调用,包括通过接口类型对方法的调用?
- 我的第二种方法可行吗?检测哪些方法引用了外部程序集并包装它们?
- 还有其他方法可以解决这个问题吗?
【问题讨论】:
标签: postsharp