Is it possible to use reflection in CompileTimeInitialize in PostSharp 3.1?

Following code worked in 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);
    }
}

With the 3.1 upgrade, this.locationInfo becomes Missing Property and accessing any of its properties cause NullReferenceException.

Was I doing this a wrong way or has this been changed in 3.1 upgrade? If so, can you suggest me the right way to approach this?

PS: If I set this.locationInfo in RuntimeInitialize things work properly.

有帮助吗?

解决方案

You can use reflection in CompileTimeInitialize method and, actually, locationInfo holds correct information during that method's execution.

However, the locationInfo field is then serialized, and later deserialized during runtime. This is where the problem happens - apparently, version 3.1 has introduced a bug related to serialization in this particular case. You can check this by saving only locationInfo.Name in the field, for example.

It means you'd need to wait for a bug fix to be implemented in 3.1. You may also want to report the bugs directly on the PostSharp support forum.

Update: The issue has been fixed in PostSharp build 3.1.30.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top