如何从MethodBase中找出方法的返回类型?我正在使用PostSharp并尝试覆盖CompileTimeValidate(MethodBase方法)方法以确保该属性应用于具有正确签名的方法.
谢谢,
有没有人在生产环境中使用Postsharp AOP框架?有任何陷阱吗?为了做一些日志记录等,Postsharp可以和Log4Net一起使用吗?
任何有关使用Postsharp与Web Apps和/或Log4Net的教程都将受到高度赞赏.
提前致谢.
我正在使用VS2008,并希望根据属性上的自定义属性创建编译时警告/错误(如果可能).
目前有两个案例让我感兴趣:
  [MyAttribute (typeof(MyClass)]
MyClass必须实现一个接口.目前我在属性的构造函数中声明了这一点,但由于堆栈跟踪的性质,这不容易跟踪:
 public MyAttribute (Type MyClassType)
    {
         System.Diagnostics.Debug.Assert(typeof(MyInterface).IsAssignableFrom(MyClassType),
                                         "Editor must implement interface: " + typeof(MyInterface).Name);
    }
我感兴趣的第二种情况是我在属性中定义了一个类型,如果该类型实现了一个接口,那么如果另一个属性不存在则应该显示警告.
IE if(MyClass.Implements(SomeInterface)&&!Exists(SomeAttibute)){Generate Warning}
[MyAttribute(typeof(MyClass)] 
// Comment next line to generate warning
[Foo ("Bar")]
谢谢!
我最近开始在我的一些项目中使用PostSharp,并注意到一个不幸的副作用 - 它使用的所有项目中的代码覆盖率显着下降.
我猜测这种情况发生的原因是分析仪看到了PostSharp代码并且很多代码没有经过测试(例如用于通用异常处理和日志记录的样板代码).我显然可以为使用这些方面的每种方法编写单元测试,但如果我说实话,那感觉就像浪费时间.
有没有人有这种经历的经验?
我有一个简单的PostSharp日志记录属性:
[Serializable]
public class MethodLoggingAttribute : OnMethodBoundaryAspect
{
    private ILog _logger;
    public override void OnEntry(MethodExecutionEventArgs eventArgs)
    {
        _logger = LogManager.GetLogger(eventArgs.Method.DeclaringType.ToString());
        _logger.DebugFormat("Entered {0}", eventArgs.Method.Name);
    }
}
我想通过向日志条目添加有关方法参数的信息来使此属性更加灵活,但仅在需要时才这样做.
[Serializable]
public class MethodLoggingAttribute : OnMethodBoundaryAspect
{
    private ILog _logger;
    public override void OnEntry(MethodExecutionEventArgs eventArgs)
    {
        _logger = LogManager.GetLogger(eventArgs.Method.DeclaringType.ToString());
        // if ShowParameters = true
        _logger.DebugFormat("Entered {0} with args:{1}", eventArgs.Method.Name, args);
        // else
        _logger.DebugFormat("Entered {0}", eventArgs.Method.Name);
        // endif
    }
}
带有IF的伪代码是我不知道该怎么做的.如何将其传递给属性?我希望它看起来像这样,但我不知道如何在属性代码中处理它:
[MethodLogging(ShowParameters=true)]
public void SomeCrazyMethod(int CustomerId, string SecretName) {...}
哪个在功能,易用性,文档,示例,社区/支持,VS集成,已知实现,长期可行性以及实现自定义AOP框架的构建速度方面更好?
我将从我所知道的开始(到目前为止我只尝试过PostSharp):
根据推荐的PostSharp最佳实践,我的PostSharp包含在我的所有项目中.但是,我在其中一些程序集中没有任何方面或其他变换; 他们只是引用其他项目做在使用方面.
在构建时,我收到以下警告:
模块"xxxxxxx.dll"不包含任何方面或其他转换.为了提高构建时性能,请考虑通过在项目中设置编译符号(也称为常量)'SkipPostSharp'来禁用此模块的PostSharp,或者设置MSBuild属性'SkipPostSharp = True'.
感谢您的信息,PostSharp!但我"考虑禁用此模块的PostSharp",并决定不这样做.我很高兴失去一点构建时间性能,以换取后来当我决定在以前没有方面的项目中使用PostSharp时不必考虑它.
如何让PostSharp停止告诉我这个提示,而不启用SkipPostSharp?
我想知道如何确定此构建错误的来源;
Warning 4   The primary reference "MyNamespace.MyProject" could not be resolved because 
   it has an indirect dependency on the .NET Framework assembly "System.Xml, Version=4.0.0.0,
   Culture=neutral, PublicKeyToken=b77a5c561934e089" which has a higher version "4.0.0.0" than
   the version "2.0.0.0" in the current target framework.   MyNamespace.MyOtherProject
我理解这个错误的意思(以及其他5个同样的项目),但我无法解决如何在我的情况下解决它.在这种情况下,"主要引用"(MyNamespace.MyProject)与.NET 4.0.x没有直接的依赖关系.
主要参考仅依赖于我的另一个项目(MyNamespace.MyCoreProject),构建的源项目(MyNamespace.MyOtherProject)也直接依赖于该项目.构建并没有抱怨该项目间接引用.NET 4.0.x,所以我认为我可以排除这一点.
主要引用直接依赖于三(3)个第三方DLL,所有这些DLL也都是Target .NET 2.0.
我已经使用dotPeek来检查构建的库,并且看不到任何使用.NET 4.0的引用.
工作中唯一的另一个潜在扳手是PostSharp的使用,它直接由'MyNamespace.MyCoreProject'引用(由主参考项目引用),这可能导致问题,因为我相信有一个相关的VS2010错误引用PostSharp.dll(http://www.sharpcrafters.com/forum/Topic4444-4-1.aspx#bm4462),但我也从构建链中删除了它仍然看到此错误,所以我假设我也可以统治那个.
如果有人能告诉我为什么会这样,真棒!如果没有,关于如何弄清楚不受干扰的"间接参考"的一些方向将同样有用!
顺便说一下,我已经尝试了以下所有工具来获取一些信息,但它们并没有告诉我很多我还不知道(这是有问题的DLL的直接依赖性); - .NET Reflector - dotPeek - IldAsm - 取决于(Dependency Walker)