PostSharp.Sdk.CodeModel.BindingException: 无法获取反射对象
PostSharp.Sdk.CodeModel.BindingException: Cannot get the reflection object
我正在开发一个 autocad 插件,我正在使用 PostSharp OnMethodBoundaryAspect 在插件引入的每个命令之前执行一些任务。我已经使用属性以声明方式添加了方面。
[PSerializable]
[MulticastAttributeUsage(MulticastTargets.Method, TargetMemberAttributes = MulticastAttributes.Public)]
public class OnCommandBoundaryAspect : OnMethodBoundaryAspect {
...
}
然后在命令中class
[OnCommandBoundaryAspect]
public class AnnotationCommands {
[CommandMethod("MY_ACAD_COMMAND")]
public void MyCommand() {
doStuff();
}
}
针对普通 acad dll(普通 autocad 安装附带的 dll)编译插件时一切正常。我们也有包含插件的 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 安装程序附带的 dll 相比,autocad OEM dll 在某种程度上受到限制。
这是怎么回事?为什么 postsharp 试图反映项目中引用的 dll?有什么解决问题的建议吗?
好的,我应该知道这一点,但我们在命令 类 中也有一些 LispFunctions 并且 LispFunctionAttribute 类型在 autocad OEM dll 中不可用。
[LispFunction("GetProperties")]
public static ResultBuffer GetProperties(ResultBuffer args) {
....
}
从 postsharp 中排除方法解决了这个问题。
如果可以的话,最好在异常中显示类型名称
"PostSharp.Sdk.CodeModel.BindingException: Cannot get the reflection
object for 'xxxxx.dll'"
如果程序集存在于 GAC 中并且在构建之前未被删除,也会出现此问题。方法签名更改等重大更改可能会影响 PostSharp 目标,因为它期望来自您的源的一个签名并在 GAC 中找到另一个签名。
从您的 GAC 文件夹中删除程序集以帮助消除此原因。
我正在开发一个 autocad 插件,我正在使用 PostSharp OnMethodBoundaryAspect 在插件引入的每个命令之前执行一些任务。我已经使用属性以声明方式添加了方面。
[PSerializable]
[MulticastAttributeUsage(MulticastTargets.Method, TargetMemberAttributes = MulticastAttributes.Public)]
public class OnCommandBoundaryAspect : OnMethodBoundaryAspect {
...
}
然后在命令中class
[OnCommandBoundaryAspect]
public class AnnotationCommands {
[CommandMethod("MY_ACAD_COMMAND")]
public void MyCommand() {
doStuff();
}
}
针对普通 acad dll(普通 autocad 安装附带的 dll)编译插件时一切正常。我们也有包含插件的 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 安装程序附带的 dll 相比,autocad OEM dll 在某种程度上受到限制。
这是怎么回事?为什么 postsharp 试图反映项目中引用的 dll?有什么解决问题的建议吗?
好的,我应该知道这一点,但我们在命令 类 中也有一些 LispFunctions 并且 LispFunctionAttribute 类型在 autocad OEM dll 中不可用。
[LispFunction("GetProperties")]
public static ResultBuffer GetProperties(ResultBuffer args) {
....
}
从 postsharp 中排除方法解决了这个问题。
如果可以的话,最好在异常中显示类型名称
"PostSharp.Sdk.CodeModel.BindingException: Cannot get the reflection object for 'xxxxx.dll'"
如果程序集存在于 GAC 中并且在构建之前未被删除,也会出现此问题。方法签名更改等重大更改可能会影响 PostSharp 目标,因为它期望来自您的源的一个签名并在 GAC 中找到另一个签名。
从您的 GAC 文件夹中删除程序集以帮助消除此原因。