OwinBuilder.GetAppStartup错误“无法加载文件或程序集” - 如何查找程序集的调用位置?

时间:2017-01-22 06:10:55

标签: asp.net reflection owin postsharp

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

  

[FileNotFoundException:无法加载文件或程序集   'PostSharp.Sdk,Version = 2.1.0.0,Culture = neutral,   PublicKeyToken = b13fd38b8f9c99d7'或其依赖项之一。该   系统找不到指定的文件。]
  System.ModuleHandle.ResolveType(RuntimeModule模块,Int32 typeToken,   IntPtr * typeInstArgs,Int32 typeInstCount,IntPtr * methodInstArgs,   Int32 methodInstCount,ObjectHandleOnStack type)+0
  System.ModuleHandle.ResolveTypeHandleInternal(RuntimeModule模块,   Int32 typeToken,RuntimeTypeHandle [] typeInstantiationContext,   RuntimeTypeHandle [] methodInstantiationContext)+191
  System.Reflection.RuntimeModule.ResolveType(Int32 metadataToken,   键入[] genericTypeArguments,Type [] genericMethodArguments)+162
  System.Reflection.CustomAttribute.FilterCustomAttributeRecord(CustomAttributeRecord   caRecord,MetadataImport范围,汇编& lastAptcaOkAssembly,   RuntimeModule decoratedModule,MetadataToken decoratedToken,   RuntimeType attributeFilterType,Boolean mustBeInheritable,Object []   属性,IList derivedAttributes,RuntimeType&属性类型,   IRuntimeMethodInfo&安培; ctor,布尔& 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(字符串   friendlyName,IList 1 errors, Boolean& conflict) +189
Owin.Loader.DefaultLoader.GetDefaultConfiguration(String friendlyName, IList
1个错误)+68
  Owin.Loader.DefaultLoader.LoadImplementation(String startupName,   IList 1 errorDetails) +89 Owin.Loader.DefaultLoader.Load(String startupName, IList 1 errorDetails)+30
  Microsoft.Owin.Host.SystemWeb.OwinBuilder.GetAppStartup()+ 165   Microsoft.Owin.Host.SystemWeb.OwinHttpModule.InitializeBlueprint()+37   System.Threading.LazyInitializer.EnsureInitializedCore(T& target,   布尔和放大器;初始化,对象& syncLock,Func`1 valueFactory)+137
  Microsoft.Owin.Host.SystemWeb.OwinHttpModule.Init(HttpApplication的   上下文)+172
  System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr的   appContext,HttpContext上下文,MethodInfo []处理程序)+618
  System.Web.HttpApplication.InitSpecial(HttpApplicationState状态,   MethodInfo [] handlers,IntPtr appContext,HttpContext context)+172
  System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr的   appContext,HttpContext context)+402
  System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr的   appContext)+343

据我所知,Owi​​n.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-versionissue with PostSharp cannot find assembly for system.web.mvc, version=3.0.0.0 when no projects reference it看起来很相似,但它们存在相反的问题:PostSharp无法解析MVC或Owin dll。

有人可以建议如何识别哪个属性(以及哪个类)引用PostSharp.Sdk?

我认为自己做的是SearchForStartupAttribute所做的事情 - 扫描自定义属性的程序集并记录所有找到的内容。 有更好/更简单的想法吗?

1 个答案:

答案 0 :(得分:1)

感谢开源我找到了源代码 https://katanaproject.codeplex.com/SourceControl/latest#src/Owin.Loader/DefaultLoader.cs 并在本地复制该类(以及DefaultLoader使用的几个内部类)。当前代码只忽略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()

调用了这个类
    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"