PostSharp.Sdk.CodeModel.BindingException: не удается получить объект отражения

Я разрабатываю плагин 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 (библиотеки, поставляемые с обычной установкой autocad). У нас также есть OEM-продукт AutoCAD, в который включен плагин. Теперь при компиляции плагина с помощью OEM-библиотеки autocad я получаю 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).

Я понял, что OEM-библиотеки autocad каким-то образом ограничены по сравнению с dll, поставляемыми с установщиком autocad.

Что здесь происходит? Почему PostSharp пытается отразить DLL в проекте? Любое предложение, как решить проблему?

2 ответа

Решение

Хорошо, я должен был знать это, но у нас также были некоторые функции LispFunctions в командных классах, а тип LispFunctionAttribute недоступен в dll autocad OEM.

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

Исключение методов из postsharp решило проблему.

Если это возможно, было бы хорошо показать имя типа в исключении

"PostSharp.Sdk.CodeModel.BindingException: не удалось получить объект отражения для 'xxxxx.dll'"

Эта проблема также может возникнуть, если сборка присутствует в GAC и не была удалена перед сборкой. Значительные изменения, такие как изменения сигнатур метода, могут привести к ошибкам в отношении целей PostSharp, так как он ожидает одну сигнатуру от вашего источника и находит другую в GAC.

Удалите сборку из ваших папок GAC, чтобы устранить эту причину.

Другие вопросы по тегам