标签: postsharp

什么是IL编织?

我今天刚看到Ayende关于PostSharp 的帖子.我下载了代码并试了一下,我认为这是我见过的最酷,最容易使用的方法来处理AOP.

在他的帖子中,Ayende说PostSharp通过IL Weaving完成它的魔力.现在,在一些抽象的层面上,我可以推断出这意味着什么,但我想知道是否有更详细的答案.不幸的是,很长一段时间以来,谷歌第一次出现在我身上.所以我想这将是StackOverflow的一个很大的问题(因为我是一个订阅Jeff的博客好几年,现在,知道这个网站是做它的事).

那么究竟是什么IL编织以及它是如何完成的?

.net postsharp

49
推荐指数
2
解决办法
1万
查看次数

如何在C#中使用System.Reflection.MethodBase找到方法的返回类型?

如何从MethodBase中找出方法的返回类型?我正在使用PostSharp并尝试覆盖CompileTimeValidate(MethodBase方法)方法以确保该属性应用于具有正确签名的方法.

谢谢,

.net c# reflection postsharp

26
推荐指数
2
解决办法
1万
查看次数

任何具有Postsharp生产经验的人?

有没有人在生产环境中使用Postsharp AOP框架?有任何陷阱吗?为了做一些日志记录等,Postsharp可以和Log4Net一起使用吗?

任何有关使用Postsharp与Web Apps和/或Log4Net的教程都将受到高度赞赏.

提前致谢.

.net asp.net aop postsharp

24
推荐指数
3
解决办法
7508
查看次数

生成自定义编译时警告C#

我正在使用VS2008,并希望根据属性上的自定义属性创建编译时警告/错误(如果可能).

目前有两个案例让我感兴趣:

  [MyAttribute (typeof(MyClass)]
Run Code Online (Sandbox Code Playgroud)

MyClass必须实现一个接口.目前我在属性的构造函数中声明了这一点,但由于堆栈跟踪的性质,这不容易跟踪:

 public MyAttribute (Type MyClassType)
    {
         System.Diagnostics.Debug.Assert(typeof(MyInterface).IsAssignableFrom(MyClassType),
                                         "Editor must implement interface: " + typeof(MyInterface).Name);

    }
Run Code Online (Sandbox Code Playgroud)

我感兴趣的第二种情况是我在属性中定义了一个类型,如果该类型实现了一个接口,那么如果另一个属性不存在则应该显示警告.

IE if(MyClass.Implements(SomeInterface)&&!Exists(SomeAttibute)){Generate Warning}

[MyAttribute(typeof(MyClass)] 
// Comment next line to generate warning
[Foo ("Bar")]
Run Code Online (Sandbox Code Playgroud)

谢谢!

c# compiler-construction postsharp custom-attributes

19
推荐指数
1
解决办法
4385
查看次数

PostSharp和Visual Studio代码覆盖率

我最近开始在我的一些项目中使用PostSharp,并注意到一个不幸的副作用 - 它使用的所有项目中的代码覆盖率显着下降.

我猜测这种情况发生的原因是分析仪看到了PostSharp代码并且很多代码没有经过测试(例如用于通用异常处理和日志记录的样板代码).我显然可以为使用这些方面的每种方法编写单元测试,但如果我说实话,那感觉就像浪费时间.

有没有人有这种经历的经验?

.net c# code-coverage postsharp

19
推荐指数
1
解决办法
760
查看次数

酷PostSharp方面

我正在寻找有趣的PostSharp方面 - 你发现有用且不介意分享的任何东西.

.net c# aop postsharp

15
推荐指数
1
解决办法
5194
查看次数

如何为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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想通过向日志条目添加有关方法参数的信息来使此属性更加灵活,但仅在需要时才这样做.

[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
    }
}
Run Code Online (Sandbox Code Playgroud)

带有IF的伪代码是我不知道该怎么做的.如何将其传递给属性?我希望它看起来像这样,但我不知道如何在属性代码中处理它:

[MethodLogging(ShowParameters=true)]
public void SomeCrazyMethod(int CustomerId, string SecretName) {...}
Run Code Online (Sandbox Code Playgroud)

c# postsharp

15
推荐指数
1
解决办法
4424
查看次数

Mono Cecil与PostSharp Core对比Microsoft CCI实施AOP框架

哪个在功能,易用性,文档,示例,社区/支持,VS集成,已知实现,长期可行性以及实现自定义AOP框架的构建速度方面更好?

我将从我所知道的开始(到目前为止我只尝试过PostSharp):

  • Microsoft Common Compiler Instrastruture(CCI):我读过,它用于FxCop,ILMerge,Spec#和Code Contracts.它似乎是非常低的水平,因为它甚至没有注意纠正当用它修改IL时borken的分支代码的偏移.
  • PostSharp已有5年的历史,有很多AOP功能(例如,提取一些你需要手动完成IL的事情),源代码可用,只有一个人开发/支持,但他正计划将此作为一项业务,有文档但可能更好,构建需要大约两倍的时间,很少有关于如何注入IL和2.0版本的样本将很快发布,这有望得到很大改善.
  • Mono Cecil:由一个人编写,是Mono套件的一部分,Reflector的插件名为Reflexil,使用Mono Cecil.

.net aop postsharp cci mono.cecil

15
推荐指数
1
解决办法
6145
查看次数

在没有跳过PostSharp的情况下,在构建时安静地关闭PostSharp警告

根据推荐的PostSharp最佳实践,我的PostSharp包含在我的所有项目中.但是,我在其中一些程序集中没有任何方面或其他变换; 他们只是引用其他项目在使用方面.

在构建时,我收到以下警告:

模块"xxxxxxx.dll"不包含任何方面或其他转换.为了提高构建时性能,请考虑通过在项目中设置编译符号(也称为常量)'SkipPostSharp'来禁用此模块的PostSharp,或者设置MSBuild属性'SkipPostSharp = True'.

感谢您的信息,PostSharp!但我"考虑禁用此模块的PostSharp",并决定不这样做.我很高兴失去一点构建时间性能,以换取后来当我决定在以前没有方面的项目中使用PostSharp时不必考虑它.

如何让PostSharp停止告诉我这个提示,而不启用SkipPostSharp

.net c# msbuild postsharp

15
推荐指数
2
解决办法
3007
查看次数

确定对不正确的.NET Framework版本的间接依赖性的来源

我想知道如何确定此构建错误的来源;

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
Run Code Online (Sandbox Code Playgroud)

我理解这个错误的意思(以及其他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)

c# projects-and-solutions postsharp visual-studio-2010

14
推荐指数
1
解决办法
2万
查看次数