2017-11-22 1 views
0

autocad 플러그인을 개발 중이며 플러그인에서 도입 된 각 명령을 수행하기 전에 PostSharp OnMethodBoundaryAspect를 사용하여 일부 작업을 수행하고 있습니다. 애트리뷰트를 사용하여 선언적으로 애스펙트를 추가했다.PostSharp.Sdk.CodeModel.BindingException : 반사 객체를 가져올 수 없습니다.

[PSerializable] 
[MulticastAttributeUsage(MulticastTargets.Method, TargetMemberAttributes = MulticastAttributes.Public)] 
public class OnCommandBoundaryAspect : OnMethodBoundaryAspect { 
    ... 

} 

다음 정상 ACAD의 DLL에 대한 플러그인을합니다 (DLL을 일반 AutoCAD를 설치 예정) 컴파일 할 때

[OnCommandBoundaryAspect] 
public class AnnotationCommands { 

    [CommandMethod("MY_ACAD_COMMAND")] 
    public void MyCommand() { 
     doStuff(); 
    } 

} 

모든 것이 잘 작동 명령 클래스. 우리는 또한 플러그인을 포함 autocad OEM 제품이 있습니다. 은 AutoCAD OEM의 DLL을 함께 플러그인을 컴파일 할 때 지금, 나는 PostSharp.Sdk.CodeModel.BindingException

Severity Code Description Project File Line Suppression State 
Error  Unhandled exception (postsharp-net40-x64-srv.exe release | .NET Framework 4.7): PostSharp.Sdk.CodeModel.BindingException: Cannot get the reflection object for 'Acdbmgd.dll'.** 
    at ^Mzw3\.bgGgRlJ.^cCM832sT[??0](Object _0, BindingOptions _1, ^d1u4kZd5aJLe _2) 
    at PostSharp.Sdk.CodeModel.Domain.^Q77Ni+3v(AssemblyEnvelope _0, BindingOptions _1) 
    at ^XJbqCOExOmCj.^NRQTI+sj(INamedType _0, BindingOptions _1) 
    at ^Mzw3\.bgGgRlJ.^cCM832sT[??0](Object _0, BindingOptions _1, ^d1u4kZd5aJLe _2) 
    at PostSharp.Sdk.CodeModel.TypeRefDeclaration.GetSystemType(Type[] genericTypeArguments, Type[] genericMethodArguments, BindingOptions options) 
    at ^XJbqCOExOmCj.^6pB/qWH+(IMethod _0, Type& _1, Type[] _2, Type[] _3, Type[] _4, BindingOptions _5) 
    at ^XJbqCOExOmCj.^4IrPP9eT(Object _0, IMethod _1, Type[] _2, Type[] _3, BindingOptions _4) 
    at PostSharp.Sdk.CodeModel.MethodDefDeclaration.^NqB3CEvX(BindingOptions _0) 
    at ^Mzw3\.bgGgRlJ.^cCM832sT[??0](Object _0, BindingOptions _1, ^d1u4kZd5aJLe _2) 
    at PostSharp.Sdk.CodeModel.MethodDefDeclaration.GetSystemMethod(Type[] genericTypeArguments, Type[] genericMethodArguments, BindingOptions bindingOptions) 
    at PostSharp.Sdk.AspectWeaver.AspectWeaverInstance..ctor(AspectWeaver aspectWeaver, AspectInstanceInfo aspectInstanceInfo) 
    at PostSharp.Sdk.AspectWeaver.AspectWeavers.MethodLevelAspectWeaverInstance..ctor(MethodLevelAspectWeaver aspectWeaver, AspectInstanceInfo aspectInstanceInfo) 
    at ^wy1eTA/ccvw/.CreateAspectWeaverInstance(AspectInstanceInfo _0) 
    at PostSharp.Sdk.AspectWeaver.AspectWeaverTask.^lp9i7ZhC(InstructionWriter _0, AspectInstanceInfo _1, StructuredDeclarationDictionary`1 _2) 
    at PostSharp.Sdk.AspectWeaver.AspectWeaverTask.^gJhZb6Cg.^KzeTZ0pV(IMetadataDeclaration _0, AspectInstanceInfo _1) 
    at PostSharp.Sdk.AspectInfrastructure.StructuredDeclarationDictionary`1.^lNgKC+Z4(IMetadataDeclaration _0, Func`3 _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.AspectWeaver.AspectWeaverTask.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). 

내가 AutoCAD를 OEM의 DLL을가 어떻게 든 함께 오는 DLL을에 비해 제한되어 있음을 이해 스택을 볼 수 autocad 설치 프로그램.

무슨 일입니까? 포스트 샤프가 프로젝트에서 참조 된 dll을 반영하려고하는 이유는 무엇입니까? 어떤 제안이 문제를 해결하는 방법?

+0

이것은 PostSharp 5.0.39에서 수정 된 버그처럼 보입니다. 업그레이드를 시도 했습니까? –

답변

0

좋아, 내가 알고 있어야하지만 우리는 또한 명령 클래스에 일부 LispFunctions가 있고 LispFunctionAttribute 유형은 autocad OEM dll에서 사용할 수 없습니다.

[LispFunction("GetProperties")] 
public static ResultBuffer GetProperties(ResultBuffer args) { 
    .... 
} 

postsharp에서 메소드를 제외하면 문제가 해결되었습니다.

예외 유형 이름을 표시하는 것이 좋을 것입니다 가능하다면

"PostSharp.Sdk.CodeModel.BindingException 'xxxxx.dll'에 대한 반사 개체를 가져올 수 없습니다"

0

이 문제는 어셈블리가 GAC에 있고 빌드 전에 제거되지 않은 경우에도 발생할 수 있습니다. 메소드 시그니처 변경과 같은 중요한 변경 사항은 소스에서 하나의 시그니처가 필요하고 GAC에서 다른 시그니처를 찾을 때 PostSharp 타겟과 관련 될 수 있습니다.

이 원인을 제거하려면 GAC 폴더에서 어셈블리를 제거하십시오.

관련 문제