OwinBuilder.GetAppStartup 错误"Could not load file or assembly"- 如何找到调用程序集的位置?

OwinBuilder.GetAppStartup error "Could not load file or assembly"- how to find where assembly is called?

我已将 Microsoft.Owin.Host.SystemWeb 添加到现有的 Asp.Net Web 表单项目(以使用 Azure Active Directory 身份验证)并获取

[FileNotFoundException: Could not load file or assembly 'PostSharp.Sdk, Version=2.1.0.0, Culture=neutral, PublicKeyToken=b13fd38b8f9c99d7' or one of its dependencies. The system cannot find the file specified.]
System.ModuleHandle.ResolveType(RuntimeModule module, Int32 typeToken, IntPtr* typeInstArgs, Int32 typeInstCount, IntPtr* methodInstArgs, Int32 methodInstCount, ObjectHandleOnStack type) +0
System.ModuleHandle.ResolveTypeHandleInternal(RuntimeModule module, Int32 typeToken, RuntimeTypeHandle[] typeInstantiationContext, RuntimeTypeHandle[] methodInstantiationContext) +191
System.Reflection.RuntimeModule.ResolveType(Int32 metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) +162
System.Reflection.CustomAttribute.FilterCustomAttributeRecord(CustomAttributeRecord caRecord, MetadataImport scope, Assembly& lastAptcaOkAssembly, RuntimeModule decoratedModule, MetadataToken decoratedToken, RuntimeType attributeFilterType, Boolean mustBeInheritable, Object[] attributes, IList derivedAttributes, RuntimeType& attributeType, IRuntimeMethodInfo& ctor, Boolean& ctorHasParameters, Boolean& isVarArg) +148
System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeModule decoratedModule, Int32 decoratedMetadataToken, Int32 pcaCount, RuntimeType attributeFilterType, Boolean mustBeInheritable, IList derivedAttributes, Boolean isDecoratedTargetSecurityTransparent) +604 System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeAssembly assembly, RuntimeType caType) +144
Owin.Loader.DefaultLoader.SearchForStartupAttribute(String friendlyName, IList1 errors, Boolean& conflict) +189<br> Owin.Loader.DefaultLoader.GetDefaultConfiguration(String friendlyName, IList1 errors) +68
Owin.Loader.DefaultLoader.LoadImplementation(String startupName, IList1 errorDetails) +89 Owin.Loader.DefaultLoader.Load(String startupName, IList1 errorDetails) +30
Microsoft.Owin.Host.SystemWeb.OwinBuilder.GetAppStartup() +165
Microsoft.Owin.Host.SystemWeb.OwinHttpModule.InitializeBlueprint() +37 System.Threading.LazyInitializer.EnsureInitializedCore(T& target, Boolean& initialized, Object& syncLock, Func`1 valueFactory) +137
Microsoft.Owin.Host.SystemWeb.OwinHttpModule.Init(HttpApplication context) +172
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +618
System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +172
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +402
System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +343

据我所知,Owin.Loader.DefaultLoader.SearchForStartupAttribute 使用了反射,无法加载某些属性,但它没有报告它扫描了哪个属性以及它所在的位置。

我们的项目使用 PostSharp 进行缓存和日志记录,但(据我所知)我们使用的是 version="4.3.21" 并且一个属性指的是 "3.0.26.9",但无论如何应该重定向到 4.3。 21 由于

<bindingRedirect oldVersion="0.0.0.0-4.3.21.0" newVersion="4.3.21.0" />

我搜索了 "PostSharp.Sdk" 的源代码,但没有找到任何参考资料。

使用 JetBrain DotPeek 快速查看反汇编也没有显示对 PostSharp.Sdk 的任何引用。请注意 Version=2.1 非常旧。

有链接 http://support.sharpcrafters.com/discussions/problems/2275-postsharp-is-not-compatible-with-microsoftowinsecurity-latest-version and issue with PostSharp cannot find assembly for system.web.mvc, version=3.0.0.0 when no projects reference it,看起来很相似,但它们有相反的问题:PostSharp 无法解析 MVC 或 Owin dll。

谁能建议如何识别哪个属性(以及哪个 class)引用 PostSharp.Sdk?

我考虑自己做 SearchForStartupAttribute 所做的事情 - 扫描程序集以查找自定义属性并记录所有找到的内容。 有什么 better/more 简单的想法吗?

感谢开源,我找到了源代码 https://katanaproject.codeplex.com/SourceControl/latest#src/Owin.Loader/DefaultLoader.cs 并在本地复制 class(连同 DefaultLoader 使用的几个内部 classes)。当前代码仅忽略 CustomAttributeFormatException,我跟踪然后忽略所有错误

    private Tuple<Type, string> SearchForStartupAttribute(string friendlyName, IList<string> errors, ref bool conflict)
foreach (var assembly in _referencedAssemblies)
            {
                object[] attributes;
                try
                {
                    attributes = assembly.GetCustomAttributes(inherit: false);
                }
             //   catch (CustomAttributeFormatException)
             //   {
             //       continue;
             //   }
                catch (Exception exc)
                {
                    string message = "In " + assembly.ToString();
                    System.Diagnostics.Trace.WriteLine(message + " " + exc.ToString());
                    continue;
                }

我从 global.asax public Global()

调用了 class
    var loader = new Owin.Loader.Debug.DefaultLoader();
    IList<string> errorDetauls = new List<string>();
    loader.Load("Startup", errorDetauls);

它告诉我是哪个 DLL 导致了问题,我删除了引用。 DLL 引用了旧的未使用的 PostSharp 库,但直到现在才造成任何伤害。

SearchForStartupAttribute 扫描位于 bin 文件夹中的所有 DLL,并且容易出现任何问题,例如缺少引用 DLL。 我已提交建议 "DefaultLoader.SearchForStartupAttribute should be tolerant to unrelated errors"