我一直在使用PostSharp一年,最近轉移到版本3,我已經取得了很大的成功。我試圖擴大它在我們公司的採用範圍,採用的殺手功能將是多播合同屬性。Postsharp中可能存在的錯誤ReturnValue位置方面
我一直在尋找到PostSharp.Patterns.Contracts和書面MulticastAttributes他們,但有幾件事情將這些方面給我們遺留代碼時會產生摩擦,比如代替一些字符串驗證,但最ArgumentExceptions ArgumentNullException重要的是ReturnValues不能使用這些屬性。
我不得不使用OnMethodBoundaryAspect方法來增加方面的數量 - 一組參數和一組具有相同驗證的相同驗證,儘管不同的例外,這是我們的開發人員無法接受的,所以我一直試圖開發一個可以應用於參數和返回值的一組合約。
我注意到LocationContractAttribute直接來自MulticastAttribute,只包含支持各種異常和它們的消息的代碼,所以它看起來像是一個簡單的任務來編寫我自己的代碼,但是當編譯後的Postsharp啓動時,下面的簡單方面會給出一個異常:
[AttributeUsage(AttributeTargets.ReturnValue),
AspectConfiguration(SerializerType = typeof(MsilAspectSerializer)),
MulticastAttributeUsage(
MulticastTargets.ReturnValue
, TargetMemberAttributes = MulticastAttributes.NonAbstract
, Inheritance = MulticastInheritance.Multicast
, PersistMetaData = true
)]
public class SimpleReturnValueAttribute: MulticastAttribute,
ILocationValidationAspect<string>
{
public Exception ValidateValue(string value, string locationName, LocationKind locationKind)
{
return null;
}
}
到類:
public class AspectTarget
{
[return: SimpleReturnValue]
public string ReturnEmptyString2()
{
return null;
}
}
給出了異常:
Error 1 Unhandled exception (3.0.26.0, 32 bit, CLR 4.5, Release): System.NullReferenceException: Object reference not set to an instance of an object.
at PostSharp.Sdk.CodeModel.MethodDefDeclaration.^bvoT7mPt9PXI(Int32 _0)
at PostSharp.Sdk.AspectInfrastructure.CanonicalMethodMapping.^X0NY.EmitLoadArgument(Int32 _0, InstructionWriter _1)
at ^670BgLZZ9jB2.^X5f4d1Yo.Implement(MethodBodyTransformationContext _0)
at ^EbCRMdujK27A.^LuETqvLKzZPB(MetadataDeclaration _0, MetadataDeclaration _1, MethodSemantics _2, InstructionBlock _3, Object[] _4, CanonicalMethodMapping _5, LocalVariableSymbol _6, InstructionSequence _7, TypeDefDeclaration _8, PipelineTransversalState _9)
at ^PE9ycIe2cLwm.^HvVDHXOj(MetadataDeclaration _0, IDependencyTransformationInstance[] _1, PipelineTransversalState _2, MethodSemantics _3)
at PostSharp.Sdk.AspectInfrastructure.AspectInfrastructureTask.^jwku0geZ(MetadataDeclaration _0, PipelineTransversalState _1, MethodSemantics _2, Boolean _3)
at PostSharp.Sdk.AspectInfrastructure.AspectInfrastructureTask.^MwzbegST(IMetadataDeclaration _0)
at PostSharp.Sdk.AspectInfrastructure.StructuredDeclarationDictionary`1.^d+wOzSPF(IMetadataDeclaration _0, Func`2 _1)
at PostSharp.Sdk.AspectInfrastructure.StructuredDeclarationDictionary`1.^+g+TCqVg(TypeDefDeclaration _0, Func`2 _1, Set`1 _2)
at PostSharp.Sdk.AspectInfrastructure.StructuredDeclarationDictionary`1.^fJqG(Func`2 _0)
at PostSharp.Sdk.AspectInfrastructure.AspectInfrastructureTask.Execute()
at PostSharp.Sdk.Extensibility.Project.ExecutePhase(String phase)
at PostSharp.Sdk.Extensibility.Project.Execute()
at PostSharp.Hosting.PostSharpObject.ExecuteProjects()
at PostSharp.Hosting.PostSharpObject.InvokeProject(ProjectInvocation projectInvocation)
從LocationLevelAspect派生方面給出了相同的錯誤。我也嘗試過不同的值AspectConfiguration和PersistMetaData,或者完全省略它們,但是我得到相同的異常。
可以做一些援助。
乾杯。