- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
是否可以在 PostSharp 3.1 的 CompileTimeInitialize
中使用反射?
以下代码在 3.0 中有效:
public class TestClass
{
public string TestField;
[TestAspect]
public void TestMethod() { }
}
public class TestAspect : OnMethodBoundaryAspect
{
private LocationInfo locationInfo;
public override void CompileTimeInitialize(MethodBase method, AspectInfo aspectInfo)
{
this.locationInfo = new LocationInfo(method.ReflectedType.GetField("TestField"));
}
public override void OnSuccess(MethodExecutionArgs args)
{
Console.WriteLine(this.locationInfo);
}
}
随着 3.1 升级,this.locationInfo
变成了Missing Property
并且访问它的任何属性都会导致 NullReferenceException
。
我这样做是错误的方式还是在 3.1 升级中改变了?如果是这样,您能否建议我处理此问题的正确方法?
PS:如果我在 RuntimeInitialize
中设置 this.locationInfo
一切正常。
最佳答案
您可以在 CompileTimeInitialize
方法中使用反射,实际上,locationInfo
会在该方法执行期间保存正确的信息。
但是,locationInfo
字段随后被序列化,随后在运行时反序列化。这就是问题发生的地方 - 显然,3.1 版在这种特殊情况下引入了与序列化相关的错误。例如,您可以通过仅在字段中保存 locationInfo.Name 来检查这一点。
这意味着您需要等待 3.1 中的错误修复。您可能还想直接在 PostSharp support forum 上报告错误.
更新:此问题已在 PostSharp build 3.1.30 中修复。
关于c# - PostSharp 3.1 中的 CompileTimeInitialize 可以使用 Reflection 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21417411/
我有一个包含许多项目的解决方案,我想禁用 Postsharp 进行调试构建,以减少本地开发人员的构建时间。有没有办法在不编辑每个项目文件的情况下做到这一点? 我知道这听起来像是一个坏主意,但我们只使用
我的 CI 构建服务器遇到问题,其中 PostSharp 导致构建失败,并显示以下消息:程序集“yada-yada.dll”使用未经许可的功能(基本功能)。 [...]。我们使用的是当前版本的 Pos
我可以指定 SkipPostSharp 常量来确保项目从 PS 进程的项目列表中排除。但我想反过来做。我希望 PS 假设它不应该处理我没有明确告诉它的任何内容。 这可以实现吗? 最佳答案 项目被Pos
依赖注入(inject)在 Postsharp 中不起作用。如何使方面可测试?我真的想避免创建具体的类来记录我的方面。 我不希望在单元测试方法时运行方面。如果我正在测试一种方法,我不希望触发日志记录方
是否有可能在 Postsharp 的编译期间找到程序集的项目文件夹/项目文件或输出路径,例如,在 CompileTimeInitialize 期间,当正在构建程序集时? 最佳答案 您可以在编译期间通过
我正在尝试修改 Postsharp 附带的示例跟踪应用程序,以便将跟踪应用于我的命名空间中的所有类,而无需显式地将 [QuickTrace] 放在每个类的顶部。我附上了截图。我究竟做错了什么 ?右键单
根据推荐的 PostSharp 最佳实践,我在我的所有项目中都包含了 PostSharp。但是,我在其中一些程序集中没有任何方面或其他转换;他们只是引用了其他确实有使用方面的项目。 在构建时,我收到以
刚刚从 nuget 包安装了 Postsharp 2.1,然后安装了 Phil Haack 的 NullGuard 包。 当我在类或方法级别添加 [EnsureNonNullAspect] 方面时,我
你如何得到参数姓名 的一种方法。这些示例向您展示了如何获取 值 参数,但不是 姓名 .我想看到 parma = 99, parmb = 1。不仅仅是 99, 1。 using System;
假设我有一个方面实现 IInstanceScopedAspect我将这个方面应用于类型中的方法。使用 FormatterServices.GetUninitializedObject 创建对象时如何初
我正在努力理解为什么要使用后编译器,例如 PostSharp ,是否需要? 我的理解是,它只是在原始代码中插入代码,那么为什么开发人员不自己编写代码呢? 我希望有人会说它更容易编写,因为您可以在方法上
是否可以使用 PostSharp 拦截类构造函数和析构函数调用?我想为类创建事件实例计数器。 最佳答案 您可以在构造函数和析构函数上使用 OnMethodBoundaryAspect。请注意,默认情况
我有几个项目,希望在多个项目中应用方面。我像这样使用多播属性: [assembly:MyProject.Aspects.NotifiableObject( AttributeTargetAss
创建了一个简单的类来测试 PostSharp 中的 OnExceptionAspect。 [Serializable] [AttributeUsage(AttributeTargets.Method
我有一个 MethodInterceptionAspect(PostSharp) 的实现但是当我在重写 OnInvoke 方法时,args.Method 为 null,我需要知道方法返回值类型, 有人
我创建了一个小的方面层次结构。示例: public abstract class MyBaseAspectAttribute : Aspect, IAspectProvider { ... p
我喜欢在跟踪级别上记录一些 Postsharp 消息。不幸的是,记录到这个级别没有输出。所有其他级别都在工作。与控制台或 NLog 后端或当我从其他类登录时的行为相同。 如何启用跟踪级别? App.x
在开始之前,我想澄清一下,我目前对 AOP 术语的理解如下...... 方面是 AOP 等同于 OOP 中的类。 通知是 AOP 等价于 OOP 中的方法。 切入点是 AOP 等价于 OOP 中的“使
我偶然发现了 PostSharp 的一个不可思议的良好性能行为。为了评估速度,我写了一个小程序,它会执行一个函数指定的次数,如果启用了 PostSharp,它会生成和删除几百个字符串,就在内存中(非固
我正在使用 postsharp 1.5 和 OnMethodBoundaryAspect 处理一个方面。我希望我的方面默认具有以下行为: 1 - 如果在类级别使用属性,则方面仅应用于 PUBLIC 方
我是一名优秀的程序员,十分优秀!