PostSharp.Sdk.CodeModel.BindingException:无法获取反射对象

时间:2017-11-22 07:04:09

标签: c# dll postsharp autocad-plugin

我正在开发一个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编译插件时,一切正常(dll随普通autocad安装而来)。我们还有autocad OEM产品,其中包含插件。现在,当使用autocad OEM dll编译插件时,我得到 PostSharp.Sdk.CodeModel.BindingException ,请参阅stack

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 个答案:

答案 0 :(得分:0)

好的,我应该知道这一点,但我们在命令类中也有一些LispFunctions,并且autocad OEM dll中没有 LispFunctionAttribute 类型。

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

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

如果可能在异常中显示类型名称

  

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

答案 1 :(得分:0)

如果程序集存在于GAC中并且在构建之前尚未删除,则也会发生此问题。诸如方法签名更改之类的重大更改可能会影响PostSharp目标,因为它需要来自您的源的一个签名并在GAC中找到不同的签名。

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