代码之家  ›  专栏  ›  技术社区  ›  Antxx

后夏普。Sdk。代码模型。BindingException:无法获取反射对象

  •  0
  • Antxx  · 技术社区  · 7 年前

    我正在开发一个autocad插件,我正在使用PostSharp OnMethodBoundaryAspect在插件引入的每个命令之前执行一些任务。我使用属性声明性地添加了方面。

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

    然后在命令类中

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

    在针对普通acad DLL(普通autocad安装附带的DLL)编译插件时,一切正常。我们还有autocad OEM产品,其中包含插件。现在,当使用autocad OEM DLL编译插件时,我得到 后夏普。Sdk。代码模型。绑定异常 ,请参见堆栈

    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安装程序附带的DLL相比,autocad OEM DLL在某种程度上受到限制。

    怎么回事?为什么postsharp试图在项目中反映引用的dll?有什么建议可以解决这个问题吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Tom 'Blue' Piddock    6 年前

    如果组件存在于GAC中,并且在构建之前尚未移除,则也可能发生此问题。诸如方法签名更改之类的重大更改可能会影响PostSharp目标,因为它期望来自您的源的一个签名,并在GAC中找到另一个。

    从GAC文件夹中删除程序集以帮助消除此原因。

        2
  •  0
  •   Antxx    7 年前

    好的,我应该知道这一点,但我们在命令类和 LispFunctionAttribute 类型在autocad OEM DLL中不可用。

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

    排除postsharp中的方法修复了该问题。

    如果可能的话,最好在异常中显示类型名

    “PostSharp.Sdk.CodeModel.BindingException:无法获取反射 “xxxxx”的对象。dll“